3

我有两个静态列表,即 list1 和 list2

private static IList<String> list1;
private static IList<String> list2;
list1 = new List<String>() { "v1001", "v1002", "v1003","v1004" };

我正在尝试将 list1 的项目转移到 list2

list2 = list1;

现在,当我尝试从 list2 中删除某些内容时,该项目也会从 list1 中删除。

var version = "v1001"
list2.Remove(version);

我怎样才能做到这一点,我只能从 list2 中删除而不妨碍 list1。

4

3 回答 3

4

您的示例中的列表 2 和列表 1 都是同一个对象,变量 list2 和 list1 指向它。您可以使用

list2 = new List<string>(list1);

这将使它们成为不同的对象。

于 2013-09-01T05:07:14.383 回答
3

您可以使用复制构造函数:

list2 = new List<string>(list1);

或使用 Linq:

list2 = list1.Select(s => s).ToList();

也可以静态调用:

list2 = Enumerable<string>.ToList(list1);

注意:其他示例仅供参考 - Yuriy 的答案中提供的复制构造函数是最干净的方法。

于 2013-09-01T05:13:22.713 回答
1

从 list2 中删除也从 list1 中删除的原因是 list1 和 list2 都是引用类型。我的意思是 list1 和 list2 基本上存储您的列表在内存中某处的位置。当您使用 = 运算符将 list2 设置为 list1 时,您实际上所做的是告诉 list2 “好吧,您将指向 list1 所指向的内存中的同一位置。” 这意味着,如果您使用引用 list1 更改某些内容,则此更改看起来与 list2 重复(但实际上只是更改了相同的数据)。为了解决这个问题,而不是

list2 = list1;

我认为您可以使用它(正如 Yuriy Faktorovich 所说):

编辑:试试这个

class Program
{
    private static IList<string> list1 = new List<string>() { "v1001", "v1002", "v1003", "v1004" };
    private static IList<string> list2 = new List<string>(list1);

    static void Main(string[] args)
    {
        list1.Remove("v1001");
        print(list1);
        print(list2);
    }

    private static void print(IList<string> list)
    {
        foreach (string str in list)
        {
            Console.WriteLine(str);
        }
        Console.WriteLine();
    }
}
于 2013-09-01T05:25:30.353 回答