复制时,为什么我的Collection <T>与List <T>类工作不同?

时间:2019-09-13 10:01:14

标签: c# generic-collections

我想复制一个集合并将新元素添加到其中一个(不是全部)。

在下面的代码示例中,我通过创建一个 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个元素。为什么集合和列表之间有区别?

3 个答案:

答案 0 :(得分:2)

因为Collection<T>List<T>在其构造函数中做了不同的事情

Collection constructor

  

将Collection类的新实例初始化为指定列表的包装器。

List constructor

  

初始化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将给定集合的项目添加到其自己的项目存储中。

相关问题