从 List<myType> 获取最大值

Posted

技术标签:

【中文标题】从 List<myType> 获取最大值【英文标题】:Get Max value from List<myType> 【发布时间】:2010-08-12 05:18:50 【问题描述】:

我有列表List&lt;MyType&gt;,我的类型包含AgeRandomID

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

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

【问题讨论】:

【参考方案1】:

假设您可以访问 LINQ,并且 Ageint(您也可以尝试 var maxAge - 它更有可能编译):

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

如果您还需要RandomID(或整个对象),一个快速的解决方案是使用来自MoreLinq 的MaxBy

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

【讨论】:

【参考方案2】:

好的,所以如果您没有 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:恐怕我不明白你的意思。 @JonSkeet,我认为他需要对delegate 示例进行一些详细说明。我也无法理解,这就是为什么我不得不使用您在同一块中使用的第二种方法。 FindMax 的事情。 @Shrivallabh:好吧,既然 OP 接受了答案,我怀疑他们理解了。不清楚你不明白什么 - 你了解匿名方法和 lambda 表达式吗?【参考方案3】:
int max = myList.Max(r => r.Age);

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.max.aspx

【讨论】:

说明显而易见的但是......为了在 .net 4.0 和 VS2010 中使用它,您需要“使用 System.Linq;”。右键单击错误不会给出“解决”选项。【参考方案4】:
var maxAge = list.Max(x => x.Age);

【讨论】:

欢迎来到 SO!在您的解决方案中发布代码时,解释您的代码如何解决 OP 的问题会很有帮助:) 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文 最大方法在哪里? @BrijeshMavani System.Linq。 Official doc【参考方案5】:
thelist.Max(e => e.age);

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

最简单的其实就是Age.Max(),你不需要更多代码了。

【讨论】:

【参考方案8】:

这样怎么样:

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&lt;int&gt;() 5, 10, 15, 20 每当我们对该集合进行排序时,数字 20 始终位于最后一个索引处,除非我们按降序对其进行排序。

以上是关于从 List<myType> 获取最大值的主要内容,如果未能解决你的问题,请参考以下文章

从数组中获取通用枚举器

从 std::complex<MyType> 到 std::complex<double> 的类型转换

将 DataTable 转换为 List<T>

作为异步函数调用返回IEnumerable

怎样从list中取出最大的数?

ObservableCollection<MyType>, MyType 上的扩展方法:IEnumerable<MyType>