【问题标题】:How to use LINQ.Where for specific indexes如何将 LINQ.Where 用于特定索引
【发布时间】:2016-06-21 16:11:04
【问题描述】:

正如标题所说,我需要一个 LINQ 表达式,它只检查数组的几个索引。我目前有这样的:

int[] a = b.Where(c => c % 4 == (int)Cards.CardSuits.Club).ToArray();

这些不是我的实际变量名称,我只是把它缩短了一点。 我只需要检查b[2]b[b.length-1]

【问题讨论】:

  • 我不明白你最后一句话的意思——我的回答只是提供了一个检查每个条目索引的例子。如果这不能满足您的要求,请提供minimal reproducible example

标签: c# arrays linq expression conditional-statements


【解决方案1】:

如果您想在谓词中使用索引而不是值,请使用Where 的重载,它接受一个检查值/索引对的谓词:

int[] a = b.Where((value, index) => index % 4 == (int) Cards.CardSuits.Club)
           .ToArray();

(不过,我强烈建议您对卡片进行不同的建模 - 考虑具有 SuitRank 属性的结构或类。然后您可以检查花色是否是梅花 much 更自然的方式...)


如果您实际上想要保留现有过滤器,但只是忽略源的前两个元素,您可能想要Skip

int[] a = b.Skip(2)
           .Where(c => c % 4 == (int) Cards.CardSuits.Club)
           .ToArray();

【讨论】:

  • 如果b 的值为51-36 int[] a = b.Where((value, index) => index % 4 == (int)Cards.CardSuits.Club).ToArray(); 的值为51 和36,而int[] a = b.Where(c => c % 4 == (int)Cards.CardSuits.Club).ToArray(); 的值为36,为什么会这样?是不是因为我们划分的是索引而不是值?
  • @KOPEUE:第一个是处理源中条目的index,而后者是处理value条目。请注意,您没有告诉我们数组中有什么,或者您期望什么结果,这使得帮助您变得更加困难。
  • 我没有看到 value 在谓词函数中使用。是不是少了什么东西?
  • @ubi:不,因为问题的标题是“如何将 LINQ.Where 用于特定索引”——我认为这意味着 OP 想要按索引而不是按值进行过滤。现在已经添加了对问题的不同解释的答案...
  • int[] a = b.Where((value, index) => index >= 2 && value % 4 == (int)Cards.CardSuits.Club).ToArray(); 这个对我也有用(我需要它,但你是对的,我没有提到它)
【解决方案2】:

你说你只需要检查 b[1] 到 b[b.length-1],所以你只是跳过了第一个 ("[0]") 元素,对吧?为此,请这样做:

b.Skip(1).Where(...)

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多