2016-03-14 421 views
2

我有这样的二维数组列表:如何获得二维数组列表的最大/最小值在C#

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 /最小的一个(在这种情况下最大的是192)。

有没有一个简单的方法来做到这一点,或者我只是将不得不循环通过老式的方式?

回答

3

那么,你可以使用下面的代码从int[,]

var enumarable = from int item in square2 
       select item; 

还可以获得IEnumarable<int>,您可以使用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>包含款项。为了获得最大值的索引,您应该使用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是一个整数列表,包含总和。那么你可以用Max方法得到最大和,并且IndexOf得到最大值的索引。

+0

我支持这个答案,这看起来很简单。但执行速度较慢,因为您必须访问IEnumerable并使用Linq。但它比for循环更清洁。我怀疑有比for循环更快的方法,因为IEnumerable也在for循环中执行。 – Aizen

+0

@MehrdadKamali只是片刻 – Valentin

+0

@MehrdadKamali我已经更新了答案。 – Valentin

2

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

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

如果数组的值和维数很大,您应该注意可能发生的溢出。

有没有一个简单的方法来做到这一点,或者我只是要循环通过老式的方式?

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

+0

当我粘贴到我的程序中时,它显示我这样的错误:'Queryable.Cast (IQueryable)'是一种方法,它在给定的上下文中无效。顺便说一句,我不是教授。 –

+0

@Mehrdad Kamali,是的,你是对的。编辑后查看代码。 –

相关问题