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

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

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

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

【问题讨论】:

    标签: list c#-2.0


    【解决方案1】:

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

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

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

    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】:

      【讨论】:

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

      【讨论】:

      • 欢迎来到 SO!在您的解决方案中发布代码时,解释您的代码如何解决 OP 的问题会很有帮助:)
      • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文
      • 最大方法在哪里?
      • @BrijeshMavani System.LinqOfficial 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 始终位于最后一个索引处,除非我们按降序对其进行排序。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-29
            • 1970-01-01
            相关资源
            最近更新 更多