Linq 使用 max 选择单个值
本文关键字:单个值 选择 max 使用 Linq | 更新日期: 2023-09-27 18:36:08
如何获取属性 ID 3 ?有没有办法将结果投射给康塔?
List<Conta> contas = new List<Conta>();
contas.Add(new Conta { ID = 1, Saldo = 30 });
contas.Add(new Conta { ID = 2, Saldo = 50 });
contas.Add(new Conta { ID = 3, Saldo = 100 });
var result = contas.Where(c => c.Saldo == contas.Max(l => l.Saldo)) ;
var max = Users.OrderByDescending(x => x.Saldo).FirstOrDefault();
如果您只需要一个结果,请使用Single()
或First()
:
var result = contas.FirstOrDefault(c => c.Saldo == contas.Max(l => l.Saldo));
这将返回具有最大 Saldo 的Conta
对象。
您需要一个MaxBy()
扩展方法。这些在 NuGet 上广泛可用。
一旦你有了它,解决方案就变得很简单:
List<Conta> contas = new List<Conta>();
contas.Add(new Conta { ID = 1, Saldo = 30 });
contas.Add(new Conta { ID = 2, Saldo = 50 });
contas.Add(new Conta { ID = 3, Saldo = 100 });
var result = contas.MaxBy(x => x.Saldo);
Console.WriteLine(result.ID);
下面是 MaxBy() 的示例实现(归功于 Jon Skeet 等人):
public static class EnumerableExt
{
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
return source.MaxBy(selector, Comparer<TKey>.Default);
}
public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
{
if (!sourceIterator.MoveNext())
{
throw new InvalidOperationException("Sequence was empty");
}
TSource max = sourceIterator.Current;
TKey maxKey = selector(max);
while (sourceIterator.MoveNext())
{
TSource candidate = sourceIterator.Current;
TKey candidateProjected = selector(candidate);
if (comparer.Compare(candidateProjected, maxKey) > 0)
{
max = candidate;
maxKey = candidateProjected;
}
}
return max;
}
}
}
不使用
.Where()
使用 Single()
/SingleOrDefault()
/First()
/FirstOrDefault()
如果结果中有 0 个或超过 1 个元素,Single
将引发异常。
如果结果中有超过 1 个元素,SingleOrDefault
将引发异常。
结果,First
将抛出(列表为空)
如果列表为 null,FirstOrDefault
将抛出。