C#で配列の一部を別の配列にコピーする方法は?


144

配列の一部を別の配列にコピーするにはどうすればよいですか?

私が持っていると考えて

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

配列の開始インデックスと終了インデックスを指定すると、a別の配列にコピーされます。

開始インデックスを1、終了インデックスを3とすると、要素2、3、4が新しい配列にコピーされます。

回答:


273
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
  • a =ソース配列
  • 1 =ソース配列の開始インデックス
  • b =宛先配列
  • 0 =宛先配列の開始インデックス
  • 3 =コピーする要素

7
現在利用可能な名前付きパラメーターを使用すると、5つのパラメーターのいずれも文書化する必要がなくなります。
Hamish Grubijan

11
@ハミッシュ、たぶん。個人的には、コードが大幅に明確にならない限り、明示的な名前を追加することはありません。また、(この場合)パラメータ名だけでそれが実現されるかどうかはわかりません。
マークグラベル

19

この質問を参照してください。LINQ Take()とSkip()は、Array.CopyTo()と同様、最も一般的な回答です。

ここでは、より高速な拡張方法について説明します


1
SOに関する別の質問と適切な回答:stackoverflow.com/a/3539065/411428
Manfred

2
パフォーマンス・クリティカルな状況に対処するときLINQは理想的ではないことに注意してください
XDの顔私に

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は、配列の要素をb配列にコピーするメソッドCopyを持つクラスです。

ある配列から別の配列にコピーするときは、コピーする別の配列に同じデータ型を提供する必要があります。


1

注:この質問は、既存の配列のサイズ変更する方法に対する回答のステップの1つを探すために見つかりました。

したがって、配列のサイズ変更の質問に対する部分的な回答として、範囲コピーを実行する方法を他の誰かが探している場合に備えて、ここにその情報を追加すると思いました。

私と同じことを探してこの質問を見つけた他の人にとって、それは非常に簡単です:

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

ここで、Tはタイプです。つまり、arrayVariableが宣言されています。

T[] arrayVariable;

このメソッドは、nullチェックを処理し、newSize == oldSizeは何の効果もありません。もちろん、配列の1つが他の配列よりも長い場合を暗黙的に処理します。

詳細については、MSDNの記事を参照してください。


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();
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.