2011-01-25 110 views
14

我需要一個從DataRow生成的Dictionary<string,object>。我目前有這方面的工作,但我做得太多,沒有利用.ToDictionary()擴展方法。如何在DataRow上使用.ToDictionary()擴展方法

有人請賜教我如何成功完成這項任務嗎?

這裏是我的失敗嘗試:

var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns); 

這會返回一個KeyValuePair<DataColumnCollection, DataRow>,但同樣,我提前再次需要Dictionary<string,object>

謝謝!

+1

你忘了提及你想爲鍵和值是什麼?沒有這個,你的問題就沒有意義了。我將使用一般條款發佈答案。 – driis 2011-01-25 20:20:58

+0

感謝您的回答 - 我認爲我可以完成這項工作。我的密鑰需要是列名,我的值需要是數據行中該列的值。 – BueKoW 2011-01-25 20:26:36

回答

8

你需要specifiy你想要的關鍵,這可能是在表中acn列:

.ToDictionary(row => (string)row["acn"]); 

ToDictionary需要花費一秒鐘的委託,如果你想在返回的字典上運行值的轉變。

編輯

我會留下原始答案,因爲它解釋了一般情況。你想要一個單一的行;然後使用它的列作爲鍵和列值作爲值,這是你如何做到的。

DataRow row = dataTable.Select(acn + "=" + accountNumber).Single(); // You might want SingleOrDefault 
var dataDictionary = row.Table.Columns.ToDictionary(col => col.Name, col => row[col.Name]); 

免責聲明,上面寫着沒有手頭編譯器,可能需要一些調整。

25

我知道這是舊的,但對於那些一起走以後正確的LINQ表達的driis的代碼稍加修改:

var dictionary = row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row.Field<string>(col.ColumnName)); 
-1

我喜歡LINQ

dataTable.Rows.Cast<DataRow>().Select(e=>e.Table.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => e[col.ColumnName])).ToList() 
2

@ jjoelson的答案產生一個Dictionary<string, string>。如果你想要一個Dictionary<string, object>,你可以,當然,這樣做:

var dictionary = row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row.Field<object>(col.ColumnName)); 

但略少令人費解的版本是:

var dictionary row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row[col]);