将一个字符串数组复制到另一个数组

23

我该如何从另一个string[]复制string[]

假设我有string[] args。我该如何将它复制到另一个数组string[] args1中?

3个回答

34
  • 要创建一个与原始数组内容相同的全新数组(浅表复制),请调用 Array.Clone 并将结果强制转换。
  • 要将字符串数组的一部分复制到另一个字符串数组中,请调用 Array.CopyArray.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" } 

嗨Jon,为什么字符串数组克隆是“深度”克隆?我的意思是我知道Array.Clone()是浅复制;虽然它对其他引用类型(例如CultureInfo)进行浅复制,但它在字符串数组上以某种方式进行“深度”复制。例如,如果我克隆一个包含“Hello”,“World”的数组;在克隆之后,我将第一个元素设置为null。然后我期望克隆的数组的第一个元素也应该是null,但它仍然是Hello。希望你明白我的意思,尽管无法在评论中展示代码示例。 - dragonfly02
@stt106:你为什么会期望它是null呢?它创建的是一个浅拷贝,也就是创建了一个相同大小的新数组,并将原始数组中的每个值复制到新数组中。使用CultureInfo时也会看到完全相同的行为。 - Jon Skeet
但是新数组中的引用指向原始数组中指向的相同对象;因此,如果修改原始或克隆(新)数组中的任何一个,则另一个数组也应该反映修改 - dragonfly02
@stt106:不会,因为修改数组并不等同于修改引用所指向的对象。如果你写array[0] = null,那就是在说“忽略数组中的旧值;新值为null”。为什么会影响其他数组呢?想象一下,我有一张打印出来的网址列表,并将其复印给你。如果我涂掉其中一个网址,这并不会对你的复印件产生任何影响。但是,如果我修改了其中一个网址所指向的页面,你就会看到差异。 - Jon Skeet
1
好的,我明白了。感谢你在解释中提供的示例。我猜字符串并不是测试数组浅拷贝的最佳引用类型示例,因为它是不可变的...可能这就是为什么MSDN使用CultureInfo而不是字符串的示例的原因。 - dragonfly02

28

分配目标数组的空间,使用 Array.CopyTo() 方法:

targetArray = new string[sourceArray.Length];
sourceArray.CopyTo( targetArray, 0 );

5
使用Clone()可以让这个特定情况变成一行代码。 - Jon Skeet

0
上面的答案展示了一个浅拷贝;所以我想要添加一个使用序列化的深拷贝示例;当然,也可以通过循环原始数组并将每个元素复制到全新的数组中来实现深拷贝。
 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));
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接