我想复制一个集合并将新元素添加到其中一个(不是全部)。
在下面的代码示例中,我通过创建一个 new 集合并将其传递给构造函数来复制该集合。之后,我仅在其中一个集合中添加一个元素。之后,两个集合都包含新元素...
var listOne = new Collection<Test>();
listOne.Add(new Test());
listOne.Add(new Test());
var listTwo = new Collection<Test>(listOne);
listOne.Add(new Test());
Console.WriteLine(listOne.Count); // 3
Console.WriteLine(listTwo.Count); // 3 (NOT OK)
当我使用列表而不是集合时,它会按预期工作。
var listOne = new List<Test>();
listOne.Add(new Test());
listOne.Add(new Test());
var listTwo = new List<Test>(listOne);
listOne.Add(new Test());
Console.WriteLine(listOne.Count); // 3
Console.WriteLine(listTwo.Count); // 2 (OK)
在两种情况下,我都希望第二个列表仅包含2个元素。为什么集合和列表之间有区别?
答案 0 :(得分:2)
因为Collection<T>
和List<T>
在其构造函数中做了不同的事情
将Collection类的新实例初始化为指定列表的包装器。
初始化List类的新实例,该实例包含从指定集合中复制的元素 [...]
答案 1 :(得分:2)
Collection
的构造函数非常简单:
public Collection(IList<T> list)
{
if (list == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.list);
this.items = list;
}
List
构造函数更为复杂,如下所示:
public List(IEnumerable<T> collection)
{
if (collection == null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
if (count == 0)
{
this._items = List<T>._emptyArray;
}
else
{
this._items = List<T>._emptyArray;
foreach (T obj in collection)
this.Add(obj);
this._size = count;
}
}
这是因为Collection
是作为一个简单而灵活的类创建的。因此,它具有虚拟方法,而不是List
。
答案 2 :(得分:1)
当您查看source code时,会发现一个集合没有复制给定集合的内容。它只是将给定的集合引用为自己的项目。
list's constructor将给定集合的项目添加到其自己的项目存储中。