我的IEnumerable应该枚举IEnumerable作为参数传递给AddRange()这样的方法吗?

时间:2012-12-07 11:12:48

标签: c#

我的班级实施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:在枚举期间修改了集合。

1 个答案:

答案 0 :(得分:1)

List<T>.AddRange的行为会有所不同,具体取决于它传递的序列是否实现ICollection<T>。在第一种情况下,List<T>实施ICollection<T>,因此AddRange可以调用CopyTo来执行批量复制。在第二个你只是传递一个任意的IEnumerable<T>,所以它必须迭代它才能继续。

从根本上说,你在第二种情况下做了一些奇怪的事情。简单的答案不是那样做。我不希望结果得到保证 - 它应该取决于实现是否它急切地迭代传入的序列并且然后复制它,或者它是否懒得。这两种实现都适用于任何理智的序列。