Как получить Property 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)) ;
0
Helio Ferreira 25 Фев 2016 в 18:13

4 ответа

Лучший ответ

Используйте Single() или First(), если вам нужен только один результат:

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

Это вернет объект Conta с максимальным значением Saldo.

1
Arturo Menchaca 25 Фев 2016 в 15:17

Вам нужен метод расширения 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 () (за это спасибо Джону Скиту и др.):

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;
        }
    }
}
1
Matthew Watson 25 Фев 2016 в 15:26
var max = Users.OrderByDescending(x => x.Saldo).FirstOrDefault();
0
Souhaieb Besbes 25 Фев 2016 в 15:22

Вместо использования .Where() используйте Single() / SingleOrDefault() / First() / FirstOrDefault()

Single вызовет исключение, если в результате будет 0 или более 1 элементов.

SingleOrDefault вызовет исключение, если в результате будет более 1 элемента.

First выбрасывает, если результатов нет (список пуст)

FirstOrDefault выбрасывает, если список нулевой.

0
Mathew Spearey 25 Фев 2016 в 15:51