2011-01-25 9 views
14

Potrzebuję Dictionary<string,object>, która jest produkowana z DataRow. Obecnie mam coś do pracy, ale robię o wiele za dużo i nie wykorzystuję metody rozszerzenia .ToDictionary().Jak używać metody rozszerzającej .ToDictionary() na DataRow

Czy ktoś może mnie oświecić, jak to osiągnąć?

Oto moja nieudana próba:

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

Zwraca KeyValuePair<DataColumnCollection, DataRow>, ale znowu, potrzebuję Dictionary<string,object>

Dzięki jeszcze raz z góry!

+1

zapomniałeś wspomnieć, co chcesz jako klucz i wartość? Bez tego twoje pytanie nie ma sensu. Opublikuję odpowiedź na ogólne warunki. – driis

+0

Dzięki za odpowiedź - myślę, że mogę wykonać tę pracę. mój klucz musi być nazwą kolumny, a moja wartość musi być wartością dla tej kolumny w datarze. – BueKoW

+0

Hmm - czy wybierasz wiele wierszy, czy też 'Wybierz' pasuje tylko do jednego? – driis

Odpowiedz

8

Trzeba specifiy klawisz chcesz, co może być kolumna acn w tabeli:

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

ToDictionary zajmuje drugą delegata, jeśli chcesz uruchomić transformację na wartości w zwróconym słownika.

Edit

Zostawię oryginalną odpowiedź ponieważ wyjaśnia ogólnym przypadku. Chcesz wziąć jeden rząd; następnie użyj jego kolumn jako kluczy i wartości kolumn jako wartości, no,. Tak to robisz.

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

Zastrzeżone, powyższy został napisany bez kompilatora pod ręką, może potrzebować trochę szczypanie.

+0

Powyższy kod jest w porządku, ale został "napisany bez kompilatora". Zamiast tego użyj odpowiedzi @ jjoelsona. –

25

wiem, że to jest stary, ale dla tych, którzy przychodzą później poprawne wyrażenie LINQ jest nieznaczna modyfikacja kodu driis męska:

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

Lubię LINQ

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

@ odpowiedź jjoelson za produkuje Dictionary<string, string>. Jeśli chcesz Dictionary<string, object>, można oczywiście zrobić:

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

Ale nieco mniej zawiłe wersja:

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