web-dev-qa-db-ja.com

文字列配列を別の配列にコピーする

別のstring[]からstring[]をコピーするにはどうすればよいですか?

string[] argsがあるとします。別の配列string[] args1にコピーするにはどうすればよいですか?

18
Arunachalam

Array.CopyTo()を使用するターゲット配列にスペースを割り当てます。

targetArray = new string[sourceArray.Length];
sourceArray.CopyTo( targetArray, 0 );
22
sharptooth
  • 同じ内容の完全に新しい配列を(浅いコピーとして)作成するには: Array.Clone を呼び出して、結果をキャストします。
  • 文字列配列の一部を別の文字列配列にコピーするには: Array.Copy または Array.CopyTo を呼び出します

例えば:

using System;

class Test
{
    static void Main(string[] args)
    {
        // Clone the whole array
        string[] args2 = (string[]) args.Clone();

        // Copy the five elements with indexes 2-6
        // from args into args3, stating from
        // index 2 of args3.
        string[] args3 = new string[5];
        Array.Copy(args, 2, args3, 0, 5);

        // Copy whole of args into args4, starting from
        // index 2 (of args4)
        string[] args4 = new string[args.Length+2];
        args.CopyTo(args4, 2);
    }
}

args = { "a", "b", "c", "d", "e", "f", "g", "h" }から始めるとすると、結果は次のようになります。

args2 = { "a", "b", "c", "d", "e", "f", "g", "h" }
args3 = { "c", "d", "e", "f", "g" }
args4 = { null, null, "a", "b", "c", "d", "e", "f", "g", "h" } 
29
Jon Skeet

上記の回答は、浅いクローンを示しています。そのため、シリアライゼーションを使用してディープクローンの例を追加すると思いました。もちろん、元の配列をループして各要素を新しい配列にコピーすることによって、ディープクローンを行うこともできます。

 private static T[] ArrayDeepCopy<T>(T[] source)
        {
            using (var ms = new MemoryStream())
            {
                var bf = new BinaryFormatter{Context = new StreamingContext(StreamingContextStates.Clone)};
                bf.Serialize(ms, source);
                ms.Position = 0;
                return (T[]) bf.Deserialize(ms);
            }
        }

ディープクローンのテスト:

 private static void ArrayDeepCloneTest()
        {
            //a testing array
            CultureInfo[] secTestArray = { new CultureInfo("en-US", false), new CultureInfo("fr-FR") };

            //deep clone
            var secCloneArray = ArrayDeepCopy(secTestArray);

            //print out the cloned array
            Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator));

            //modify the original array
            secTestArray[0].DateTimeFormat.DateSeparator = "-";

            Console.WriteLine();
            //show the (deep) cloned array unchanged whereas a shallow clone would reflect the change...
            Array.ForEach(secCloneArray, x => Console.WriteLine(x.DateTimeFormat.DateSeparator));
        }
0
stt106