从List <myType>获取最大值


69

我有List List<MyType>,我的类型包含AgeRandomID

现在,我想从此列表中找到最大年龄。

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

Answers:


42

好的,因此,如果您没有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.Maxif来返回if块。例如:

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

代表人的类型请您举个例子
Shrivallabh 2013年

@Shrivallabh:恐怕我不明白你的意思。
乔恩·斯基特

@JonSkeet,我认为他需要对delegate示例进行详细说明。我也无法理解,这就是为什么我不得不使用您在同一块中使用的第二种方法的原因。FindMax的东西。
Afzaal Ahmad Zeeshan 2014年

1
@Shrivallabh:很高兴看到OP接受了答案,我怀疑他们理解了。不清楚您不了解什么-您了解匿名方法和lambda表达式吗?
乔恩·斯基特

110

假设你有机会获得LINQ,并且Ageint(你也可以尝试var maxAge-这是更容易编译):

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

如果还需要RandomID(或整个对象),则可以MaxByMoreLinq使用快速解决方案

MyType oldest = myTypes.MaxBy(t => t.Age);

@Waheed-然后您应该将其添加到您的问题中。您使用的是什么版本-2.0或3.0?
科比

抱歉 我使用的是2.0
Waheed,2010年



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

1
欢迎来到SO!在解决方案中发布代码时,解释您的代码如何解决OP的问题非常有帮助:)
Joel

尽管此代码可以回答问题,但最好解释一下如何解决问题并提供代码作为示例或参考。仅代码的答案可能会造成混乱,并且缺少上下文
xploshio18年

max方法在哪里?
user8478

@BrijeshMavani System.Linq官方文件
Sviatoslav V.

2

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

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值大于列表的大小。
杰森·纽兰德

该值可以是任何值。我们根据它在集合中的位置而不是它的实际值来获取它。例如,List<int>(){ 5, 10, 15, 20 }每当我们对该集合进行排序时,数字20总是在最后一个索引处,除非我们对其进行降序排序。
Behnam Rasooli

1

实际上Age.Max(),最简单的方法就是,您不需要任何其他代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.