2
我需要一种优雅的方式将DataRowCollection转换为NameValueCollection。将DataRowCollection转换为NameValueCollection
注:在转换过程中,我需要一个部分,在那里我可以调用一个变形器来收拾键名
我需要一种优雅的方式将DataRowCollection转换为NameValueCollection。将DataRowCollection转换为NameValueCollection
注:在转换过程中,我需要一个部分,在那里我可以调用一个变形器来收拾键名
您需要遍历所有的行和手动添加所需的列。
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);
}
嗨,谢谢你的回答。你能指导我做些什么吗?我不熟悉LINQ ToLookup(r => tidyFunc(r [0] .ToString()),r => r [1] .ToString()) – 2011-01-21 02:40:04