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

Linq 使用 max 选择单个值

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将抛出。