配列の一部を別の配列にコピーするにはどうすればよいですか?
私が持っていると考えて
int[] a = {1,2,3,4,5};
配列の開始インデックスと終了インデックスを指定すると、a
別の配列にコピーされます。
開始インデックスを1、終了インデックスを3とすると、要素2、3、4が新しい配列にコピーされます。
配列の一部を別の配列にコピーするにはどうすればよいですか?
私が持っていると考えて
int[] a = {1,2,3,4,5};
配列の開始インデックスと終了インデックスを指定すると、a
別の配列にコピーされます。
開始インデックスを1、終了インデックスを3とすると、要素2、3、4が新しい配列にコピーされます。
回答:
int[] b = new int[3];
Array.Copy(a, 1, b, 0, 3);
この質問を参照してください。LINQ Take()とSkip()は、Array.CopyTo()と同様、最も一般的な回答です。
ここでは、より高速な拡張方法について説明します。
注:この質問は、既存の配列のサイズを変更する方法に対する回答のステップの1つを探すために見つかりました。
したがって、配列のサイズ変更の質問に対する部分的な回答として、範囲コピーを実行する方法を他の誰かが探している場合に備えて、ここにその情報を追加すると思いました。
私と同じことを探してこの質問を見つけた他の人にとって、それは非常に簡単です:
Array.Resize<T>(ref arrayVariable, newSize);
ここで、Tはタイプです。つまり、arrayVariableが宣言されています。
T[] arrayVariable;
このメソッドは、nullチェックを処理し、newSize == oldSizeは何の効果もありません。もちろん、配列の1つが他の配列よりも長い場合を暗黙的に処理します。
詳細については、MSDNの記事を参照してください。
独自の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();
}
}