Получить максимальное значение из списка <myType> - PullRequest
49 голосов
/ 12 августа 2010

У меня есть список List<MyType>, мой тип содержит Age и RandomID

Теперь я хочу найти максимальный возраст из этого списка.

Какой самый простой и эффективный способ?

Ответы [ 7 ]

80 голосов
/ 12 августа 2010

Если у вас есть доступ к LINQ, а Age - это int (вы также можете попробовать var maxAge - он с большей вероятностью скомпилируется):

int maxAge = myTypes.Max(t => t.Age);

Если вам также нуженRandomID (или весь объект), быстрое решение - использовать MaxBy из MoreLinq

MyType oldest = myTypes.MaxBy(t => t.Age);
32 голосов
/ 12 августа 2010

Хорошо, поэтому, если у вас нет LINQ, вы можете жестко закодировать его:

public int FindMaxAge(List<MyType> list)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Empty list");
    }
    int maxAge = int.MinValue;
    foreach (MyType type in list)
    {
        if (type.Age > maxAge)
        {
            maxAge = type.Age;
        }
    }
    return maxAge;
}

Или вы можете написать более общую версию, которую можно повторно использовать для множества типов списков:

public int FindMaxValue<T>(List<T> list, Converter<T, int> projection)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Empty list");
    }
    int maxValue = int.MinValue;
    foreach (T item in list)
    {
        int value = projection(item);
        if (value > maxValue)
        {
            maxValue = value;
        }
    }
    return maxValue;
}

Вы можете использовать это с:

// C# 2
int maxAge = FindMax(list, delegate(MyType x) { return x.Age; });

// C# 3
int maxAge = FindMax(list, x => x.Age);

Или вы можете использовать LINQBridge :)

В каждом случае вы можете вернуть блок if с помощьюпростой вызов Math.Max, если хотите.Например:

foreach (T item in list)
{
    maxValue = Math.Max(maxValue, projection(item));
}
31 голосов
/ 12 августа 2010
8 голосов
/ 12 августа 2010
thelist.Max(e => e.age);
4 голосов
/ 20 сентября 2018
var maxAge = list.Max(x => x.Age);
1 голос
/ 20 января 2016

Как насчет этого:

List<int> myList = new List<int>(){1, 2, 3, 4}; //or any other type
myList.Sort();
int greatestValue = myList[ myList.Count - 1 ];

Вы в основном позволяете методу Sort() выполнять работу за вас вместо того, чтобы писать свой собственный метод. Если вы не хотите сортировать свою коллекцию.

0 голосов
/ 08 июня 2019

Самый простой способ - использовать System.Linq, как описано выше

using System.Linq;

public int GetHighestValue(List<MyTypes> list)
{
    return list.Count > 0 ? list.Max(t => t.Age) : 0; //could also return -1
}

Это также возможно с помощью словаря

using System.Linq;

public int GetHighestValue(Dictionary<MyTypes, OtherType> obj)
{
    return obj.Count > 0 ? obj.Max(t => t.Key.Age) : 0; //could also return -1
}
...