从List<myType>中获取最大值

90

我有一个列表 List<MyType>,其中 MyType 包含 AgeRandomID

现在我想从这个列表中找到最大的年龄。

最简单和最有效的方法是什么?

8个回答

138

假设您可以访问LINQ,并且Age是一个int(您也可以尝试使用var maxAge - 这更有可能编译成功):

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

如果你还需要RandomID(或整个对象),一个快速的解决方案是使用MaxBy,它来自于MoreLinq
MyType oldest = myTypes.MaxBy(t => t.Age);

47
好的,如果您没有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 = FindMaxValue(list, delegate(MyType x) { return x.Age; });

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

或者你可以使用LINQBridge :)

在每种情况下,如果你愿意,你可以通过简单调用Math.Max来返回if块。例如:

foreach (T item in list)
{
    maxValue = Math.Max(maxValue, projection(item));
}

委托类型,你能举个例子吗? - Shrivallabh
@Shrivallabh:恐怕我不明白你的意思。 - Jon Skeet
1
@JonSkeet,我认为他需要对“delegate”示例进行一些详细说明。我也无法理解它,这就是为什么我不得不使用同一块中您使用的第二种方法——FindMax的原因。 - Afzaal Ahmad Zeeshan
1
@Shrivallabh:既然OP接受了答案,我猜他们肯定理解了。不清楚你对它有什么不理解的地方——你理解匿名方法和Lambda表达式吗? - Jon Skeet

39

3
显而易见,为了在 .net 4.0 和 VS2010 中使用这个,你需要添加 "using System.Linq;"。右键点击错误不会出现“解决”选项。 - Soenhay

17
var maxAge = list.Max(x => x.Age);

1
欢迎来到SO!在您的解决方案中发布代码时,解释您的代码如何解决OP的问题是很有帮助的 :) - Joel
虽然这段代码可能回答了问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅有代码的答案可能会令人困惑并缺乏上下文。 - xploshioOn
max方法在哪里? - Brijesh Mavani
@BrijeshMavani System.Linq. 官方文档 - Sviatoslav V.

9
thelist.Max(e => e.age);

3

最简单的方法是使用先前描述的 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
}

3
最简单的方法就是使用Age.Max(),不需要任何其他代码。

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

你基本上让 Sort() 方法为你完成工作,而不是编写自己的方法。除非你不想对集合进行排序。

如果这不是所需的操作,特别是当列表中的int值大于列表的大小时,这将无法正常工作。 - Jason Newland
该值可以是任何值。我们根据它在集合中的位置获取它,而不是它的实际值。例如,List<int>(){ 5, 10, 15, 20 },无论何时我们对这个集合进行排序,数字20总是在最后一个索引处,除非我们按降序排序。 - Behnam Rasooli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接