10 개의 요소로 구성된 배열 X가 있습니다. 인덱스 3에서 시작하여 인덱스 7로 끝나는 X의 모든 요소를 포함하는 새 배열을 만들고 싶습니다. 물론 나를 위해 할 루프를 쉽게 작성할 수 있지만 가능한 한 코드를 깨끗하게 유지하고 싶습니다. . C #에 나를 위해 할 수있는 방법이 있습니까?
(의사 코드)와 같은 것 :
Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)
Array.Copy
내 요구에 맞지 않습니다 . 새 배열의 항목이 복제본이 필요합니다. Array.copy
C 스타일 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();
그러나 그것은 다소 덜 효율적입니다.
보다 구체적인 상황에 대한 옵션에 대해서는 유사한 질문에 대한 이 답변 을 참조하십시오 .
답변
답변
참조를 복사하는 것이 아니라 복제를 원한다고 봅니다. 이 경우 .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 그들은 새로운 도입했습니다 Range
및 Index
유형을
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();