【问题标题】:Select only the lowest values with Linq使用 Linq 仅选择最小值
【发布时间】:2023-03-20 11:12:01
【问题描述】:

嗨 我得到了以下 linq,用于在最低值之后订购我的输入。 但我希望它只输出最低值。

var sortedDict = (from entry in x where entry.Value > 0 orderby entry.Value ascending select entry);

现在如果它得到以下输入。

3  4  2  6  2

这将是我的输出

2  2  3  4  6

我需要在我的 linq 中更改什么,所以我只能得到这个输出

2  2

【问题讨论】:

    标签: c# .net sql linq c#-4.0


    【解决方案1】:

    好吧,你可以这样做:

    int min = x.Min(entry => entry.Value);
    var lowestValues = x.Where(entry => entry.Value == min);
    

    请注意,我已明确将它们分开,就像您使用 Where(entry => entry.Value == x.Min(y => y.Value)) 一样,它会在每次迭代中寻找最小值。另一方面,LINQ to Objects 也是如此 - 但在 LINQ to SQL 中,更好在一个查询中完成所有操作,然后让数据库对其进行排序。

    【讨论】:

    • 这会比 KJN 的答案更快吗?他的回答会导致 Min() 为数据列表中的每个条目重新计算,还是编译器会对该值进行一些缓存。我对此表示怀疑,但我想以一种或另一种方式确认它。
    • @Øyvind Bråthen:如果您使用的是 LINQ to Objects,那么可以 - 将为列表中的每个条目重新计算 Min()。
    【解决方案2】:

    你可以试试这样的:

    data.Where (d => d == data.Min())
    

    请注意,这不一定是最快的方法。

    【讨论】:

    • 如果将 data.Min() 缓存在变量中,则可以将其从 O(n^2) 变为 O(n)。我正在假设这些 linq 函数和 C# 编译器的实现。
    【解决方案3】:

    首先,找到最小值:

    var min = (from entry in x where entry.Value > 0 select entry).Min();
    

    然后,选择项目:

    var sortedDict = from entry in x where entry.Value == min select entry
    

    您的方案不需要排序。

    【讨论】:

    • 感谢您成为唯一记得检查 0 以上数字的人 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多