我的班级实施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:在枚举期间修改了集合。
答案 0 :(得分:1)
List<T>.AddRange
的行为会有所不同,具体取决于它传递的序列是否实现ICollection<T>
。在第一种情况下,List<T>
实施ICollection<T>
,因此AddRange
可以调用CopyTo
来执行批量复制。在第二个你只是传递一个任意的IEnumerable<T>
,所以它必须迭代它才能继续。
从根本上说,你在第二种情况下做了一些奇怪的事情。简单的答案不是那样做。我不希望结果得到保证 - 它应该取决于实现是否它急切地迭代传入的序列并且然后复制它,或者它是否懒得。这两种实现都适用于任何理智的序列。