2

我的班级实现IEnumerable<T>. 类还实现:

void AddRange(IEnumerable<T> items) 
{
    // items can be a deffered query against the collection items being added to
    var itemslist = items.ToList();
    ...processing and adding...
}

但我有些怀疑转换为静态集合是否是一个好的设计

例如 List 本身没有这样的东西:

var list = new List<int> {1, 2, 3};
list.AddRange(list.Select(i => i+list.Count).ToList());

没有例外。

var list = new List<int> {1, 2, 3};
list.AddRange(list.Select(i => i+list.Count));

InvalidOperationException :在枚举期间修改了集合。

4

1 回答 1

1

List<T>.AddRange将根据传递的序列是否实现而表现不同ICollection<T>。在第一种情况下,List<T>implements ICollection<T>,因此AddRange可以调用CopyTo进行批量复制。在第二个中,您只是传入了一个任意的IEnumerable<T>,因此它必须对其进行迭代才能继续。

不过,从根本上说,在第二种情况下,您正在做一些奇怪的事情。简单的答案是不要那样做。我不希望结果得到保证 - 它是否急切地迭代传递的序列然后复制它,或者它是否懒惰地执行它应该取决于实现。任何一种实现都适用于任何健全的序列。

于 2012-12-07T11:19:20.293 回答