2014-01-09 42 views
2

簡單問題。我有一個Dictionary<int, double>,我希望從列DataTable填充。因此,對於與單個列一個DataTable將單列數據錶轉換爲索引爲鍵的字典

23.9 
39009.0 
32.99 
12.1 

我想Dictionary<int, double>

{ 1, 23.9 }, 
{ 2, 39009.0 }, 
{ 3, 32.99 }, 
{ 4, 12.1 } 

其中鍵是自動遞增。要做到這一點,我寫了一些基本的代碼:

Dictionary<int, double> d = new Dictionary<int, double>(); 
List<double> tmp = dataTable.AsEnumerable() 
    .Select(c => Double.Parse(c[i].ToString())).ToList(); 

int index = 1; 
foreach (var j in tmp) 
    d.Add(index++, j); 

我可以用一個查詢做LINQ嗎?我不是一個LINQ粉絲男孩,他喜歡爲了它而寫它,但我確實喜歡更好的LINQ技能,而且我似乎無法用一個LINQ查詢來解決這個問題,儘管它是可能可能。

謝謝你的時間。

回答

9

我可以用LINQ做一個查詢嗎?

Dictionary<int, double> dict = dataTable.AsEnumerable() 
    .Select((row, index) => new { row, index }) 
    .ToDictionary(x=> x.index + 1, x=> x.row.Field<double>(0)); 
+0

這很甜。我不熟悉'new {row,index}在這裏做什麼。你能詳細說明嗎? – MoonKnight

+0

這就是所謂的[匿名類型](http://msdn.microsoft.com/en-us/library/bb397696.aspx)類似於沒有名字的類。它有兩個屬性(在這種情況下):具有正確類型的'row'和'index'('DataRow' +'int')。我需要'ToDictionary'。但是因爲只有['Select'](http://msdn.microsoft.com/en-us/library/bb534869(v = vs.110).aspx)(和'Where')有一個超載,它給了我索引在序列中的元素我需要堅持它以某種方式。 –

+0

@Killercam - Tim正在使用select元素值和索引來創建一個在投影序列中同時具有這兩個值的新類型。 – Hogan

0

你可以嘗試以下方法:

d = tmp.Select((x, i) => new { Value = x, Index = i }).ToDictionary(pair => pair.Index, pair => pair.Value); 
1

有些人可能會發現這個簡單...

int index = 1; 
Dictionary<int, double> dict = dataTable.AsEnumerable().ToDictionary(x=>index++, x => x); 

與然而你去更換x => x您元素爲所需的double值。

(例如x => x.row.Field<double>(0)如果它是一列數據表)

+0

但是'DataTable'沒有擴展方法'ToDictionary'。如果你使用'AsEnumerable()',這是不可能的。 – MoonKnight

+0

我編輯它使用'AsEnumerable()',因爲我的測試是在列表上而不是表格。 – Hogan