【问题标题】:Linq using max to select a single valueLinq 使用 max 选择单个值
【发布时间】:2016-02-25 23:51:19
【问题描述】:

如何获取属性 ID 3 ?有没有办法将结果转换为 Conta?

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

【问题讨论】:

标签: c# .net linq


【解决方案1】:
var max = Users.OrderByDescending(x => x.Saldo).FirstOrDefault();

【讨论】:

  • 简单、简短、甜美。我喜欢!我最近走上了写一些冗长的“Max”函数的道路,只是为了意识到这是完美的。谢谢。
【解决方案2】:

如果您只想要一个结果,请使用 Single()First()

var result = contas.FirstOrDefault(c => c.Saldo == contas.Max(l => l.Saldo));

这将返回具有最大 Saldo 的 Conta 对象。

【讨论】:

    【解决方案3】:

    您想要一个MaxBy() 扩展方法。 These are widely available on 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;
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      不要使用.Where(),而是使用Single() / SingleOrDefault() / First() / FirstOrDefault()

      Single如果结果中有0个或多于1个元素会抛出异常。

      如果结果中有超过 1 个元素,SingleOrDefault 将抛出异常。

      First如果没有结果会抛出(列表为空)

      如果列表为空,FirstOrDefault 将抛出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多