2016-03-14 420 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,是的,你是對的。編輯後查看代碼。 –

相關問題