如何使用 LINQ 获取具有最低值的项
本文关键字:最低值 何使用 LINQ 获取 | 更新日期: 2023-09-27 18:33:52
我在下面有类 -
public class Test
{
public string TestServerName;
public string TestApplicationRunning;
public bool IsAvailable;
public long Counter;
}
如何使用 LINQ 获取计数器值最低的项目?
假设所有项目中的最低计数器值为 0,则 LINQ 应返回计数器值为 0 的所有项目。计数器值最小值可能超过 1 个。
您可以使用
Min
扩展方法,然后在Where
扩展方法的帮助下过滤源代码:
var minValue = source.Min(x => x.Counter);
var result = source.Where(x => x.Counter == minValue).ToList();
不要忘记包含Systme.Linq
命名空间。顺便说一句,使用这种方法,您将对源执行两个查询。
你也可以
做:
source.GroupBy(x=>x.Counter)
.OrderBy(x=>x.Key)
.Take(1)
.Select(x=>x).ToList();
虽然它不像Fᴀʀhad的解决方案那么明显:)
试试这个例子:
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();
如果要出现第一个匹配项,请使用"优先或默认"。
通过下面的查询,您可以找到第 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;
您可以使用
MoreLinq 中的 MinBy
(或MaxBy
)扩展方法。
从这个问题开始,最小功能更改为返回 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);