如何在c#中得到2d数组列表的最大/最小值

时间:2016-03-14 21:47:07

标签: c# arrays list

我有一个像这样的2d数组列表:

    static void Main(string[] args) {
        List<int[,]> kidsL = new List<int[,]>();
        int[,] square1 = new int[8, 8];
        int[,] square2 = new int[8, 8];
        int[,] square3 = new int[8, 8];
        for (int i = 0; i < 8; i++)
            for (int j = 0; j < 8; j++) {
                square1[i, j] = 1;
                square2[i, j] = 2;
                square3[i, j] = 3;
            }
        kidsL.Add(square1);
        kidsL.Add(square2);
        kidsL.Add(square3);
        Console.WriteLine();
        Console.Read();
    }

我想确定每个数组的总和并找到maxamim / minimum(在这种情况下,最大值为192)。

是否有一种简单的方法可以做到这一点,或者我只是要以老式的方式循环?

2 个答案:

答案 0 :(得分:3)

好吧,您可以使用以下代码从IEnumarable<int>

获取int[,]
var enumarable = from int item in square2
                 select item;

此外,您可以使用Cast<int>()方法将int[,]展开到IEnumarable<int>

然后您可以使用Max()Min() linq方法。

var min = kidsL.Min(x => (from int item in x select item).Sum());
var max = kidsL.Max(x => (from int item in x select item).Sum());
// or
var min = kidsL.Min(x => x.Cast<int>().Sum())

var Max = (from int[,] array in kidsL
           select (from int item in array select item).Sum())
          .Max();

<强>更新

from int[,] array in kidsL select (from int item in array select item).Sum()查询会返回包含总和的IEnumarable<int>。为了使索引为max,您应该使用ToListToArray()将IEnumarable强制转换为数组或列表。

var sumList = (from int[,] array in kidsL
               select(from int item in array select item).Sum())
               .ToList();

var maxSum = sumList.Max();
var maxInd = sumList.IndexOf(maxSum);

sumList是一个int列表,包含总和。那么你可以使用Max方法获得最大值和IndexOf来得到最大值的索引。

答案 1 :(得分:2)

Cast<int>方法将数组展平为IEnumerable<int>,允许使用LINQ。

var max = kidsL.Max(square => square.Cast<int>().Sum());
var min = kidsL.Min(square => square.Cast<int>().Sum());

如果数组的值和尺寸很大,您还应该知道可能发生的溢出。

  

是否有一种简单的方法可以做到这一点,或者我只是要以老式的方式循环?

虽然解决方案简洁,但它与循环每个数组的每个元素具有相同的效率。但这确实是一种简单的方法。