我有两个静态列表,即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);
我怎样才能做到这一点,我只能在不妨碍list1的情况下从list2中删除。
答案 0 :(得分:4)
示例中的列表2和列表1都是相同的对象,变量列表2和list1指向它。你可以使用
list2 = new List<string>(list1);
会使它们成为不同的对象。
答案 1 :(得分:3)
您可以使用复制构造函数:
list2 = new List<string>(list1);
或使用Linq:
list2 = list1.Select(s => s).ToList();
也可以静态调用:
list2 = Enumerable<string>.ToList(list1);
注意:其他示例仅供参考--Yuriy的答案中提供的复制构造函数是最简洁的方法。
答案 2 :(得分: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();
}
}