2009-04-09 4 views
122

배열의 일부를 다른 배열에 복사하는 방법은 무엇입니까? 배열의 일부를 C#의 다른 배열에 복사하는 방법?

내가 그것을 다른 배열에 복사 취득해야 배열 a의 시작 인덱스와 끝 인덱스를 주면 내가 지금

int[] a = {1,2,3,4,5}; 

에 봉착 고려하십시오.

마찬가지로 시작 인덱스를 1로 지정하고 인덱스를 3으로 종료하면 요소 2, 3, 4가 새 배열에 복사됩니다.

답변

219
int[] b = new int[3]; 
Array.Copy(a, 1, b, 0, 3); 
  • A = 소스 어레이
  • 1 = 소스 어레이의 시작 인덱스
  • B = 대상 배열
  • 0 =
  • 를 복사
  • 3 = 요소 목적지 어레이 인덱스를 시작할
+5

지금 사용할 수있는 명명 된 매개 변수를 사용하면 5 개의 매개 변수 중 하나를 기록 할 필요가 없습니다. –

+11

@Hamish 음, 아마도. 개인적으로 코드를 상당히 명확하게하지 않는 한 명확한 이름을 추가하지 않을 것이며이 경우 매개 변수 이름 *이이를 달성 할 것인지 확신 할 수 없습니다. –

16

this question을 참조하십시오. LINQ Take() 및 Skip()은 Array.CopyTo()뿐 아니라 가장 많이 사용되는 답변입니다.

A가 더 빠르다고 extension method is described here.

+0

감사합니다. 정확히 내가 무엇을 찾고 있었는지. – iamserious

+0

SO에 대한 적절한 대답이있는 또 다른 질문 : http://itackoverflow.com/a/3539065/411428 – Manfred

+1

LINQ는 성능이 중요한 상황을 처리 할 때 이상적이지 않습니다. –

1

참고 : 나는 기존 배열의 크기를 조정하는 방법을 에 대한 대답의 단계 중 하나를 찾고이 질문을 발견했다.

다른 사람이 배열의 크기를 조정하는 질문에 대한 부분 대답으로 원거리 복사본을 수행하는 방법을 찾고있는 경우에 대비하여 여기에 정보를 추가한다고 생각했습니다. 다른 내가 있었다 같은 일을 찾고이 질문을 찾는 사람들을위한

, 그것은 매우 간단합니다 :

T이 arrayVariable가 선언 된 유형, 즉이다
Array.Resize<T>(ref arrayVariable, newSize); 

:

T[] arrayVariable; 

이 메소드는 null 체크와 newSize == oldSize를 처리하지 않고 물론 배열 중 하나가 다른 것보다 긴 경우 자동으로 처리합니다.

자세한 내용은 the MSDN article을 참조하십시오.

2
int[] a = {1,2,3,4,5}; 

int [] b= new int[a.length]; //New Array and the size of a which is 4 

Array.Copy(a,b,a.length); 

여기서 Array는 배열의 요소를 b 배열에 복사하는 Copy 메서드가있는 클래스입니다.

한 배열에서 다른 배열로 복사하는 동안 복사중인 다른 배열에 동일한 데이터 형식을 제공해야합니다.

0

직접 구현하려는 경우 Array.Copy 메서드입니다.

제네릭 유형의 정적 메서드입니다.

static void MyCopy<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long destinationIndex, long copyNoOfElements) 
{ 
    long totaltraversal = sourceIndex + copyNoOfElements; 
    long sourceArrayLength = sourceArray.Length; 

    //to check all array's length and its indices properties before copying 
    CheckBoundaries(sourceArray, sourceIndex, destinationArray, copyNoOfElements, sourceArrayLength); 
    for (long i = sourceIndex; i < totaltraversal; i++) 
    { 
     destinationArray[destinationIndex++] = sourceArray[i]; 
    } 
    } 

경계 메서드 구현.

private static void CheckBoundaries<T>(T[] sourceArray, long sourceIndex, T[] destinationArray, long copyNoOfElements, long sourceArrayLength) 
     { 
      if (sourceIndex >= sourceArray.Length) 
      { 
       throw new IndexOutOfRangeException(); 
      } 
      if (copyNoOfElements > sourceArrayLength) 
      { 
       throw new IndexOutOfRangeException(); 
      } 
      if (destinationArray.Length < copyNoOfElements) 
      { 
       throw new IndexOutOfRangeException(); 
      } 
     } 
관련 문제