2012-11-07 16 views
0

我有以下幾點:LINQ和Array.Copy

var list = new List<double[]>(); 
list.Add(new double[] { 300, 12, 22 }); 
list.Add(new double[] { 310, 13, 23 }); 
list.Add(new double[] { 320, 14, 24 }); 
list.Add(new double[] { 330, 15, 25 }); 

我想從這個獲取包含第一2列的多維數組:

double[,] a = { {300,12}, {310,13}, {320,14}, {330,15}} 

我能做到這一點使用LINQ?如何?

回答

2

請嘗試以下

var a = list.Select(x => new [] { x[0], x[1] }).ToArray(); 

編輯

最初的意圖沒有意識到的是得到一個非鋸齒狀的二維數組出來的來源。不幸的是,用標準的LINQ方法沒有辦法做到這一點。他們主要處理IEnumerable<T>T[]。但是,有什麼能夠阻止你創造它做到這一點

public static T[,] ToMultidimensionArray<T>(this List<T[]> list, int columns) 
    { 
     var array = new T[list.Count, columns]; 
     for (int i = 0; i < list.Count; i++) 
     { 
      var source = list[i]; 
      for (int j = 0; j < columns; j++) 
      { 
       array[i, j] = source[j]; 
      } 
     } 

     return array; 
    } 

的新方法,現在你可以在原始列表轉換用一個簡單的查詢

var a = list.ToMultidimensionArray(2); 
+3

這將創建一個'double [] []'而不是'double [,]''。 – Servy

+0

鋸齒陣列就是我所需要的,謝謝! – Enrico

+0

@恩里科啊昨天過去了。更新答案 – JaredPar

0
var array = list.Select(item => item.Take(2).ToArray()).ToArray(); 
foreach (var item in array) 
{ 
    Console.WriteLine("{0}, {1}", item[0], item[1]); 
} 
+2

這將創建一個'double [] []'而不是'double [,]' – Servy

+0

一個鋸齒狀的數組並不是我所需要的,謝謝! – Enrico

1

LINQ和多維數組不拌勻。 Array.Copy在這裏也不適用。

使用傳統for循環:

double[,] result = new double[list.Count, 2]; 

for (int i = 0; i < list.Count; i++) 
{ 
    result[i, 0] = list[i][0]; 
    result[i, 1] = list[i][1]; 
} 
1
public static T[,] GetColumns<T>(IList<IEnumerable<T>> source, int numColumns) 
{ 
    T[,] output = new T[source.Count, numColumns]; 

    for (int i = 0; i < source.Count; i++) 
    { 
     int j = 0; 
     foreach (T item in source[j].Take(numColumns)) 
     { 
      output[i, j] = item; 
      j++; 
     } 
    } 

    return output; 
} 

注意,在這種情況下,如果任何名單中包含不具有足夠的值來填充所有列的數組你想那麼他們將留下默認值,它不會拋出異常。如果你想要發生這種情況,你需要檢查它並自己扔掉。