gpt4 book ai didi

c# - 我的 IEnumerable 是否应该枚举作为参数传递给 AddRange() 之类的方法的 IEnumerable?

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:47 26 4
gpt4 key购买 nike

我的类(class)实现了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());

没有异常(exception)。

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

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

最佳答案

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

从根本上说,您在第二种情况下做了一些奇怪的事情。简单的答案是不要那样做。我不希望结果得到保证 - 它应该取决于实现是急切地迭代传入的序列并然后复制它,还是懒惰地执行它。对于任何理智序列,这两种实现都可以正常工作。

关于c# - 我的 IEnumerable 是否应该枚举作为参数传递给 AddRange() 之类的方法的 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com