如何使用LINQ获取具有最低值的项目?

时间:2016-02-09 07:21:48

标签: c# linq

我在课堂下面 -

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

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

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

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

你也可以这样做:

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

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

答案 2 :(得分:0)

试试这个例子:

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();

OR

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

如果您想要第一次出现使用 FirstOrDefault

答案 3 :(得分:0)

使用以下查询,您可以找到第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; 

答案 4 :(得分:0)

您可以使用extension中的MinBy(或MaxByMoreLinq方法。

从此issue开始,功能性的最小值更改为返回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);