gpt4 book ai didi

c# - 为什么在 IEnumerables 上使用标准扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:10:37 25 4
gpt4 key购买 nike

当我在 List 上使用标准的Extension Method 时,例如在哪里(...)

结果总是IEnumerable,当您决定执行列表操作,例如 Foreach()

我们需要Cast(不漂亮)或使用ToList()扩展方法

(也许)使用一个消耗更多内存的新列表(是吗?):

List<string> myList=new List<string>(){//some data};

(编辑:此转换无效)

myList.Where(p=>p.Length>5).Tolist().Foreach(...);

(myList.Where(p=>p.Length>5) as List<string>).Foreach(...);

哪个代码更好或者有第三种方法?

编辑:Foreach 是一个示例,将其替换为 BinarySerach

myList.Where(p=>p.Length>5).Tolist().Binarysearch(...)

最佳答案

as这绝对不是一个好方法,如果它有效,我会感到惊讶。

就什么是“最佳”而言,我建议 foreach而不是 ForEach :

foreach(var item in myList.Where(p=>p.Length>5)) {
... // do something with item
}

如果您迫切地想要使用列表方法,也许:

myList.FindAll(p=>p.Length>5).ForEach(...);

或者确实

var result = myList.FindAll(p=>p.Length>5).BinarySearch(...);

但请注意,这确实(与第一个不同)需要额外的数据副本,如果 myList 中有 100,000 个项目,这可能会很痛苦。长度大于 5。

LINQ 返回 IEnumerable<T> 的原因是这个 (LINQ-to-Objects) 被设计为可组合和流式传输,如果您转到列表,这是不可能的。比如几个where的组合/select等应该严格需要创建大量中间列表(事实上,LINQ 不需要)。

当您考虑到并非所有序列都是有界的时,这一点就更加重要了;有无限序列,例如:

static IEnumerable<int> GetForever() {
while(true) yield return 42;
}
var thisWorks = GetForever().Take(10).ToList();

直到 ToList它正在组合迭代器,生成中间列表。不过,有一些缓冲操作,比如 OrderBy ,需要先读取所有数据。大多数 LINQ 操作都是流式处理。

关于c# - 为什么在 IEnumerables 上使用标准扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8148264/

25 4 0