Bir dizinin bir kısmını C # 'daki başka bir diziye nasıl kopyalayabilirim?


144

Bir dizinin bir bölümünü başka bir diziye nasıl kopyalayabilirim?

Sahip olduğumu düşünün

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

Şimdi dizinin başlangıç ​​dizinini ve bitiş dizinini verirsem abaşka bir diziye kopyalanmalı.

Başlangıç ​​indeksini 1 ve bitiş dizinini 3 olarak verirsem, 2, 3, 4 öğelerinin yeni diziye kopyalanması gerekir.

Yanıtlar:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a = kaynak dizi
  • 1 = kaynak dizide başlangıç ​​dizini
  • b = hedef dizi
  • 0 = hedef dizide başlangıç ​​dizini
  • 3 = kopyalanacak öğeler

7
Şu anda kullanılabilen adlandırılmış parametrelerle, 5 parametreden herhangi birini belgelemeniz gerekmez.
Hamish Grubijan

11
@ İyi hamle, belki. Şahsen kodu önemli ölçüde daha açık hale getirmediği sürece açık isimler eklemezdim ve (bu durumda) parametre adlarının kendileri başaracağından emin değilim .
Marc Gravell


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

Array, bir dizinin öğesini b dizisine kopyalayan Copy yöntemine sahip bir sınıftır.

Bir diziden başka bir diziye kopyalarken, kopyaladığınız başka bir diziye aynı veri türünü sağlamanız gerekir.


1

Not: Bu soruyu , varolan bir dizinin yeniden boyutlandırılmasına ilişkin yanıttaki adımlardan birini ararken buldum .

Ben başka bir dizi yeniden boyutlandırma sorusuna kısmi bir cevap olarak menzilli bir kopya yapmak için nasıl aradığını durumunda Ben bu bilgileri buraya eklemek düşündüm.

Bu soruyu benimle aynı şeyi arayan herkes için çok basit:

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

burada T tiptir, yani arrayVariable bildirilir:

T[] arrayVariable;

Bu yöntem, null denetimlerin yanı sıra newSize == oldSize öğesinin hiçbir etkisi olmaz ve elbette dizilerden birinin diğerinden daha uzun olduğu durumu sessizce işler.

Daha fazla bilgi için MSDN makalesine bakın .


0

Kendi Array.Copy yönteminizi uygulamak istiyorsanız .

Genel tipte statik yöntem.

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

Sınır yönteminin uygulanması.

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();
            }
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.