Làm cách nào để sao chép một phần của mảng sang mảng khác trong C #?


144

Làm thế nào tôi có thể sao chép một phần của một mảng sang một mảng khác?

Hãy xem xét tôi đang có

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

Bây giờ nếu tôi đưa ra chỉ mục bắt đầu và chỉ mục kết thúc của mảng athì nó sẽ được sao chép sang mảng khác.

Giống như nếu tôi đưa chỉ mục bắt đầu là 1 và chỉ mục kết thúc là 3, các phần tử 2, 3, 4 sẽ được sao chép trong mảng mới.

Câu trả lời:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = mảng nguồn
  • 1 = chỉ mục bắt đầu trong mảng nguồn
  • b = mảng đích
  • 0 = chỉ mục bắt đầu trong mảng đích
  • 3 = yếu tố để sao chép

7
Với các tham số được đặt tên hiện có sẵn, bạn sẽ không cần ghi lại bất kỳ trong số 5 tham số.
Hamish Grubijan

11
@ Hamish tốt, có thể. Cá nhân tôi sẽ không thêm tên rõ ràng trừ khi nó làm cho mã rõ ràng hơn đáng kể, và tôi không chắc chắn (trong trường hợp này) mà tên tham số tự sẽ đạt được điều đó.
Marc Gravell

19

Xem câu hỏi này . LINQ Take () và Skip () là những câu trả lời phổ biến nhất, cũng như Array.CopyTo ().

Một phương pháp mở rộng có mục đích nhanh hơn được mô tả ở đây .


1
Một câu hỏi khác về SO với một câu trả lời phù hợp: stackoverflow.com/a/3539065/411428
Manfred

2
Lưu ý rằng LINQ không lý tưởng khi xử lý các tình huống quan trọng về hiệu suất
XD đối mặt với tôi

3
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);

Trong đó Array là lớp có phương thức Copy, sao chép phần tử của mảng thành mảng b.

Trong khi sao chép từ mảng này sang mảng khác, bạn phải cung cấp cùng loại dữ liệu cho mảng khác mà bạn đang sao chép.


1

Lưu ý: Tôi thấy câu hỏi này đang tìm kiếm một trong các bước trong câu trả lời về cách thay đổi kích thước một mảng hiện có.

Vì vậy, tôi nghĩ rằng tôi sẽ thêm thông tin đó vào đây, trong trường hợp bất kỳ ai khác đang tìm kiếm cách thực hiện một bản sao trong phạm vi như một câu trả lời một phần cho câu hỏi thay đổi kích thước một mảng.

Đối với bất kỳ ai khác tìm thấy câu hỏi này để tìm kiếm điều tương tự như tôi, nó rất đơn giản:

Array.Resize<T>(ref arrayVariable, newSize);

Trong đó T là kiểu, tức là nơi khai báo mảngVariable:

T[] arrayVariable;

Phương thức đó xử lý kiểm tra null, cũng như newSize == oldSize không có hiệu lực và tất nhiên xử lý âm thầm trường hợp một trong các mảng dài hơn các mảng khác.

Xem bài viết MSDN để biết thêm.


0

Trong trường hợp nếu bạn muốn thực hiện phương thức Array.Copy của riêng bạn .

Phương pháp tĩnh thuộc loại chung.

 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]; 
     } 
  }

Phương pháp thực hiện ranh giớ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();
            }
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.