【问题标题】:Can a LINQ filter alter the ordering of the original list? [duplicate]LINQ 过滤器可以改变原始列表的顺序吗? [复制]
【发布时间】: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 那么你是对的,但这不是问题。

标签: c# linq


【解决方案1】:

您可能需要检查 this brilliant SO answer,它解释了哪些 LINQ 操作改变了 Iterable 的顺序。

但要回答您的问题,破坏Iterable 顺序的仅有两个操作是:

  • 到字典
  • ToLookup

【讨论】:

  • 是的,我读过那个答案,但如果你注意到它是从 2008 年开始的!!! 12 年很长,一路走来可能会发生一些变化,特别是 Task 库和 .Net Core 计划
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2017-04-25
相关资源
最近更新 更多