[C#] 기존 배열에서 하위 배열 얻기

10 개의 요소로 구성된 배열 X가 있습니다. 인덱스 3에서 시작하여 인덱스 7로 끝나는 X의 모든 요소를 ​​포함하는 새 배열을 만들고 싶습니다. 물론 나를 위해 할 루프를 쉽게 작성할 수 있지만 가능한 한 코드를 깨끗하게 유지하고 싶습니다. . C #에 나를 위해 할 수있는 방법이 있습니까?

(의사 코드)와 같은 것 :

Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)

Array.Copy내 요구에 맞지 않습니다 . 새 배열의 항목이 복제본이 필요합니다. Array.copyC 스타일 memcpy과 동일하며 내가 찾고있는 것이 아닙니다.



답변

확장 방법으로 추가 할 수 있습니다.

public static T[] SubArray<T>(this T[] data, int index, int length)
{
    T[] result = new T[length];
    Array.Copy(data, index, result, 0, length);
    return result;
}
static void Main()
{
    int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] sub = data.SubArray(3, 4); // contains {3,4,5,6}
}

다시 복제 업데이트 (원래 질문에서 명확하지 않음). 당신이 정말로 깊은 클론을 원한다면; 같은 :

public static T[] SubArrayDeepClone<T>(this T[] data, int index, int length)
{
    T[] arrCopy = new T[length];
    Array.Copy(data, index, arrCopy, 0, length);
    using (MemoryStream ms = new MemoryStream())
    {
        var bf = new BinaryFormatter();
        bf.Serialize(ms, arrCopy);
        ms.Position = 0;
        return (T[])bf.Deserialize(ms);
    }
}

그러나 객체를 직렬화 가능 ( [Serializable]또는 ISerializable) 해야합니다 . – 당신은 쉽게 적절한 다른 직렬에 대한 대체 할 수 XmlSerializer, DataContractSerializer등, protobuf – 그물,

딥 클론은 직렬화없이 까다로울 수 있습니다. 특히 ICloneable대부분의 경우 신뢰하기가 어렵습니다.


답변

당신은 사용할 수 있습니다 Array.Copy(...)당신이 그것을 만든 후 새 배열에 복사,하지만 난 새로운 배열을 생성하는 방법이 생각하지 않습니다 사본 요소의 범위.

.NET 3.5를 사용하는 경우 LINQ를 사용할 있습니다.

var newArray = array.Skip(3).Take(5).ToArray();

그러나 그것은 다소 덜 효율적입니다.

보다 구체적인 상황에 대한 옵션에 대해서는 유사한 질문에 대한 이 답변 을 참조하십시오 .


답변

ArraySegment? 사용을 고려 했습니까 ?

http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx


답변

참조를 복사하는 것이 아니라 복제를 원한다고 봅니다. 이 경우 .Select배열 구성원을 복제본에 투영 하는 데 사용할 수 있습니다 . 예를 들어, 요소가 구현 된 경우 IClonable다음과 같은 작업을 수행 할 수 있습니다.

var newArray = array.Skip(3).Take(5).Select(eachElement => eachElement.Clone()).ToArray();

참고 :이 솔루션에는 .NET Framework 3.5가 필요합니다.


답변

다음 코드는 한 줄로 수행합니다.

// Source array
string[] Source = new string[] { "A", "B", "C", "D" };
// Extracting a slice into another array
string[] Slice = new List<string>(Source).GetRange(2, 2).ToArray();


답변

C # 8 그들은 새로운 도입했습니다 RangeIndex유형을

int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
var slice = a[i1..i2]; // { 3, 4, 5 }


답변

string[] arr = { "Parrot" , "Snake" ,"Rabbit" , "Dog" , "cat" };

arr = arr.ToList().GetRange(0, arr.Length -1).ToArray();