Преобразовать DataRowCollection в NameValueCollection - PullRequest
2 голосов
/ 21 января 2011

Мне нужен элегантный способ преобразования DataRowCollection в NameValueCollection.

примечание: во время преобразования мне нужна секция, где я могу вызвать инфлектор для очистки имен ключей

1 Ответ

2 голосов
/ 21 января 2011

Вам нужно перебрать строки и добавить нужные столбцы вручную.

var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(1, "Hello");
dt.Rows.Add(2, "World");
dt.Rows.Add(1, "Foo"); // dupe key

var nvc = new NameValueCollection();
foreach (DataRow row in dt.Rows)
{
    string key = row[0].ToString();
    // tidy up key here
    nvc.Add(key, row[1].ToString());
}

// display nvc
foreach (var key in nvc.AllKeys)
    Console.WriteLine("{0}: {1}", key, nvc[key]);

Если вы заинтересованы в Dictionary, вы можете использовать ToDictionary, однако это не будет работать, если разрешены дубликаты ключей. В этом случае другое элегантное решение будет использовать ToLookup.

// optionally use a Func to do the tidying up
// or call an existing method or do it inline for simple operations
Func<string, string> tidyFunc = (s) => s.Trim();
var lookup = dt.Rows.Cast<DataRow>()
               .ToLookup(r => tidyFunc(r[0].ToString()), r => r[1].ToString());

foreach (var g in lookup)
{
    Console.WriteLine("Key: " + g.Key);
    foreach (var item in g)
        Console.WriteLine(item);
}
...