【问题标题】:Please explain System.Linq.Enumerable.Where(Func<T, int, bool> predicate)请解释 System.Linq.Enumerable.Where(Func<T, int, bool> 谓词)
【发布时间】:2011-03-18 08:03:36
【问题描述】:

对于 Where 方法的这种重载,我无法理解 MSDN 文档,该方法接受一个具有两个参数的谓词,其中 int 据说代表源元素的索引,无论这意味着什么(我认为enumerable 是一个序列,你看不到比下一个项目更远的地方,更不用说对其进行任何索引了)。

谁能解释一下如何使用这个重载,特别是 Func 中的 int 是做什么用的以及它是如何使用的?

【问题讨论】:

  • 谢谢,鲁普。我现在明白了,但我内心的某些东西拒绝那种界面。我似乎无法将索引和序列放在同一个句子中。但是您提供的链接回答了我的问题,因为它教会了我如何使用该方法,非常感谢。

标签: c# linq extension-methods ienumerable enumerable


【解决方案1】:

int 参数表示当前项目在当前迭代中的索引。每次调用 LINQ 扩展方法之一时,理论上不能保证以相同的顺序返回项目,但您知道它们都被每个返回一次,因此可以分配索引。 (好吧,如果您知道查询对象是List&lt;T&gt; 或类似的,则可以保证,但通常不是。)

例子:

var result1 = myEnumerable.Where((item, index) => index < 4);
var result2 = myEnumerable.Take(4);
// result1 and result2 are equivalent.

【讨论】:

  • 非常感谢诺多林的精彩解释。你做了一个有趣的观察。在什么情况下,您不确定返回项目的顺序?你能详细说明一下吗?
【解决方案2】:

你不能像索引数组一样索引IEnumerable&lt;T&gt;,但你可以使用索引以某种方式过滤列表,或者可能索引另一个集合中的一些数据,这将是在条件中使用。

编辑:例如,跳过您可以使用的所有其他元素:

var results = sequence.Where((item, idx) => idx % 2 == 0);

【讨论】:

  • 谢谢,李。当然,我现在明白了,但对我个人而言,这似乎不是很直观。我不知道是什么,但该界面似乎有问题。
猜你喜欢
  • 2013-03-09
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2021-08-25
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多