【发布时间】:2020-05-19 12:23:11
【问题描述】:
假设我有一个按字母顺序排列的IEnumerable<string>。如果我像myStrings.where(s=> s.StartsWith(filter)); 一样过滤它,生成的枚举器是否仍然按字母顺序排列?
EG:能保证原订单不变吗?
编辑 1:2008 年有一个关于这个问题的答案。我读了它是的,但是因为它已经 12 岁了,并且从那时起发生了很大变化,特别是关于 .Net Core 和 TPL,我想要一个关于此事的新鲜、权威的答案,以平息进一步的发展。 .Where 更改 IEnumerable 的顺序是一种很难查明和排除故障的问题
编辑 2:“IEnumerable”不仅指List<T>,还指Dictionaries<T,T>、Array<T>[] 以及它的整个Concurrent 版本,例如ConcurrentBag<T>、ConcurrentDictionary<T,T> 等
【问题讨论】:
-
它将与原始列表的顺序相同(仅符合您的条件)。
-
@Jawad 有任何文档可以支持您的答案吗?
-
您可以阅读 LINQ
Where方法的实现,看到它没有修改顺序。 (它应该枚举项目,只产生与谓词匹配的项目。)称为Where的其他方法修改顺序并非不可能,但它必须不遗余力地这样做,你会能够在实现中看到它。 -
@Neil 我还建议您查看这篇文章:stackoverflow.com/a/204777/1390548
-
@jawas 我可以编写一个符合要求的集合,每次枚举它时都会返回不同的顺序。如果问题是关于 List
那么你是对的,但这不是问题。