【问题标题】:C# how get maximum value from list of listsC#如何从列表中获取最大值
【发布时间】:2011-10-11 08:20:54
【问题描述】:

我有一个从“制表符”分隔的字符串创建的列表列表。我不使用二维数组,而是使用列表列表,因为我不知道创建数组的大小。

会是这样的,

         0         0
   16.0000         0
   15.0000   15.0000
         0   15.0000
    2.7217    5.6904
    3.7217    5.6904

我现在想从每一列中找出最大值和最小值。 所以如果你拿上面的例子,

最大值为:16.0000 15.0000 最小值为:0 0

for (int i = 0; i < size[0]; i++)
{
  // Create size[0] x size[1] array
  obstVertex.Add(new List<double>());
  for (int y = 0; y < size[1]; y++)
  {
    obstVertex[i].Add(Convert.ToDouble(split[i+(y*size[0])]));
  }
}

如何使用 linq 找到最大值或最小值???

提前致谢

【问题讨论】:

  • 您的代码有点令人困惑,因为您引用了未在代码中显示的成员,即 size、split 和 obstVertex。
  • 是的,对不起。 size 是一个数组,用于指定列表列表的大小。因此给出的示例将具有 size[0] = 6 和 size[1] = 2。 split 是已经分隔的字符串数组。 obstVertex 是列表的列表。
  • 哪些是列:i 循环或y 循环?

标签: c# .net arrays linq list


【解决方案1】:
List<List<double>> myList;

myList.Add(new List(new double[] { 0, 16, 15, 0, 2.7217, 3.7217 }));
myList.Add(new List(new double[] { 0, 0, 15, 15, 5.6904, 5.6904 }));

List<double> maxList = myList.Select(l => l.Max()).ToList();
List<double> minList = myList.Select(l => l.Min()).ToList();

【讨论】:

  • 谢谢彼得,这如何给出第一列和第二列的最大值/最小值?
  • 它为您提供了一个最大值列表和一个最小值列表,每列一个值。它通过在每一列上调用 Max 和 Min 并返回结果来做到这一点。
  • 对不起,我应该改写...当你说 l => l.Max() 这是否意味着每一列都被选中?
  • 这意味着它在每个内部列表上调用 .Max() 。类似于:foreach (list in myList){maxList.Add(list.Max());}
【解决方案2】:

尝试以下方法:

class Program
{
    static void Main(string[] args)
    {
        var l = new List<List<double>>() {new List<Double>() {0, 16.0000, 15.0000, 0, 2.7217, 3.7217}, 
                                          new List<Double>() {0, 0, 15.0000, 15.0000, 5.6904, 5.6904}};

        int i = 1;
        var result = from sublist in l
                     select new { min = sublist.Min(), max = sublist.Max(), index = i++ };

        foreach (var r in result)
            Console.WriteLine(String.Format("Index: {0} Min: {1} Max: {2}",r.index,  r.min, r.max));

        Console.ReadKey();
    }
}

它将获取列表列表中每个子列表的最小值和最大值。

【讨论】:

    【解决方案3】:

    我假设 obstVertex 是这样声明的:

    List<List<double>> obstVertex;
    

    那么你就可以这样做了

    var minima = Enumerable.Range(0, obstVertex[0].Count - 1)
        .Select (colIndex => obstVertex.Select(row => row[colIndex]).Min())
    

    获取每列的所有最小值。

    【讨论】:

      【解决方案4】:
          static void Main(string[] args)
          {
      
              List<List<double>> lists = new List<List<double>>() { 
                  new List<double>(){0 , 0 } ,
                  new List<double>(){16.0000 , 0 } ,
                  new List<double>(){16.0000 , 15.0000 } ,
                  new List<double>(){0 , 15.0000 } ,
                  new List<double>(){2.7217 , 5.6904 } , 
                  new List<double>(){3.7217 , 5.6904 } 
              };
      
              var r =    new {
                               col1_max = (from x in lists select x[0]).Max(),
                               col1_min = (from x in lists select x[0]).Min(),
                               col2_max = (from x in lists select x[1]).Max(),
                               col2_min = (from x in lists select x[1]).Min(), 
                           }; 
      
      
              Console.WriteLine(string.Format("col1_max = {0}\r\ncol1_min = {1}\r\ncol2_max = {2}\r\ncol3_max = {3}", r.col1_max , r.col1_min , r.col2_max , r.col2_min));
      
      
              Console.Read();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 2016-01-21
        相关资源
        最近更新 更多