Скопируйте один массив строк в другой - PullRequest
18 голосов
/ 20 мая 2009

Как я могу скопировать string[] с другого string[]?

Предположим, у меня есть string[] args. Как я могу скопировать его в другой массив string[] args1?

Ответы [ 3 ]

29 голосов
/ 20 мая 2009
  • Чтобы создать совершенно новый массив с тем же содержимым (как поверхностная копия): вызовите 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" } 
22 голосов
/ 20 мая 2009

Выделите место для целевого массива, который использует Array.CopyTo ():

targetArray = new string[sourceArray.Length];
sourceArray.CopyTo( targetArray, 0 );
0 голосов
/ 27 января 2015

Приведенные выше ответы показывают мелкий клон; поэтому я подумал добавить пример глубокого клонирования с использованием сериализации; Конечно, глубокое клонирование также можно выполнить, просматривая исходный массив и копируя каждый элемент в новый массив.

 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));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...