【问题标题】:Why is LINQ not letting me OrderBy one of my data points?为什么 LINQ 不让我 OrderBy 我的数据点之一?
【发布时间】:2014-02-07 12:24:46
【问题描述】:

我有这个代码:

return inventoryItems
    .Where(i => 0 < String.Compare(i.ID, ID))
    .Take(CountToFetch);

...但我想对结果进行排序,如下所示:

return inventoryItems
    .Where(i => 0 < String.Compare(i.ID, ID))
    .Take(CountToFetch)
    .OrderBy(i.pksize);

...但是,最终的 i 是红色/超出范围。为什么?尝试将 OrderBy() 放在 Take() 之前没有任何区别。

【问题讨论】:

  • 是什么阻止你重新定义它? return inventoryItems.Where(i =&gt; 0 &lt; String.Compare(i.ID, ID)).Take(CountToFetch).OrderBy(i =&gt; i.pksize);
  • 哈哈,我怀疑你可能已经起床很晚了,应该去睡觉了:)

标签: c# asp.net-mvc linq asp.net-web-api


【解决方案1】:
return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID))
                     .Take(CountToFetch)
                     .OrderBy(i => i.pksize);

也许您应该更改OrderByTake 以使结果可预测:

return inventoryItems.Where(i => 0 < String.Compare(i.ID, ID))
                     .OrderBy(i => i.pksize)
                     .Take(CountToFetch);

【讨论】:

  • Take 的好点子。它可能是第一个是真正想要的,但你的第二个更常见。
【解决方案2】:

OrderBy 中没有 i

你想要OrderBy(i =&gt; i.pksize)(或者实际上是x =&gt; x.pksizewhatever =&gt; whatever.pksize等)

允许from x in something where x.IsOkay orderby x.Priority 等的语法一直使用相同的变量标签,但它会变成多个 lambda 表达式,每个表达式彼此分开。 (something.Where(x =&gt; x.IsOkay).OrderBy(x =&gt; x.Priority),但它们都需要是完整的表达式。

【讨论】:

    【解决方案3】:

    您似乎尝试使用您在Where 中声明的i。如果您仔细查看括号,您应该会发现它实际上不再在OrderBy 的范围内。所以第一个问题是你试图使用一个超出范围的变量。

    OrderBy 实际上需要能够检查IEnumerable 中每个元素的属性,因此仅将one 元素的属性值传递给它是没有意义的。它需要知道如何获取每个元素的属性,这就是为什么您通常会传入 lambda 表达式、匿名委托或方法。

    正如其他人指出的那样,您可以像在Where 中那样使用 lambda 表达式来解决问题:

    .OrderBy(i => i.pksize)
    

    【讨论】:

    • 是的,我已经这样做了;这就是为什么我将 Marcin 的答案标记为正确的原因。
    • @B.ClayShannon 这个答案没有解决你的问题:“为什么?”。
    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多