【问题标题】:How to get the items with lowest value using LINQ?如何使用 LINQ 获取价值最低的项目?
【发布时间】:2016-02-09 07:21:47
【问题描述】:

我有以下课程 -

  public class Test
    {
        public string TestServerName;
        public string TestApplicationRunning;
        public bool IsAvailable;
        public long Counter;
    }

如何使用 LINQ 获取计数器值最低的项目?

假设所有项目中的最低计数器值为 0,则 LINQ 应返回所有计数器值为 0 的项目。计数器值最小值可能超过 1 个项目。

【问题讨论】:

标签: c# linq


【解决方案1】:

您可以使用Min扩展方法,然后借助Where扩展方法过滤源:

var minValue = source.Min(x => x.Counter);
var result = source.Where(x => x.Counter == minValue).ToList();

不要忘记包含Systme.Linq 命名空间。 顺便说一句,使用这种方法,您将对源执行两个查询。

【讨论】:

  • 以上示例很好,因为总迭代次数为2 x length of source。而不是结合这两个查询然后迭代将是length of source x length of source
【解决方案2】:

你也可以这样做:

source.GroupBy(x=>x.Counter)
      .OrderBy(x=>x.Key)
      .Take(1)
      .Select(x=>x).ToList();

虽然它不像 Fᴀʀhad 的解决方案那么明显:)

【讨论】:

  • 不好的例子。迭代次数过多。
  • 有人说他们关心迭代吗?
  • 没有人这么说,但要确保 OP 得到的代码是好的并且更具可读性。您的代码虽然得到了结果,但也不太容易阅读和消耗内存。
  • 我还提到,与 Farhad 提供的解决方案相比,它是一种不太明显/易读的解决方案。无论如何,我会把它留在这里。如果有人想删除它,请随时这样做。
【解决方案3】:

试试这个例子:

List<Test> lstTests = new lstTests();
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test();

test1.Counter = 3;
test2.Counter = 4;
test3.Counter = 3;

lstTests.Add(test1);
lstTests.Add(test2);
lstTests.Add(test3);


var valMin = lstTests.Min(m => m.Counter);
var results = source.Where(x => x.Counter == valMin).ToList();

var result = source.Where(x => x.Counter == valMin).FirstOrDefault();

如果你想要第一次出现,请使用 FirstOrDefault

【讨论】:

    【解决方案4】:

    通过以下查询,您可以找到第 n 个最低值

    int ix = 1;
    var orderedSource  = source.OrderBy(i => i.counter).Select(y => new { rank =ix++ , value = y });
    

    您传递任何值而不是 N 以获得第 n 个最低值

    int N = 4;
    var  result  = orderedSource.Where(x=>x.rank == N).FirstOrDefault();
    Test testValue = result.value; 
    

    【讨论】:

      【解决方案5】:

      您可以使用MoreLinq 中的MinBy(或MaxByextension 方法。

      从此issue 开始,min by 功能更改为返回 T 的 IEnumerable(如果更准确:IExtremaEnumerable)而不是仅返回一个 T 项:

      public static IExtremaEnumerable<TSource> MinBy<TSource, TKey>(this IEnumerable<TSource> source,
              Func<TSource, TKey> selector, IComparer<TKey> comparer)
      

      用法示例:

      using MoreLinq;
      
      IEnumerable<Test> testList = source.MinBy(p => p.Counter);
      

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多