我正在更新一些只包含一行的Table的遗产。我想将它转换为IList。我们的想法是,IFoo的第一个属性是Name,它是Table中的列名,第二个是Value,它是列的值。
/// <summary>
/// Name = Column Name
/// </summary>
String Name { get; set; }
/// <summary>
/// Value = Column Value
/// </summary>
String Value { get; set; }
数据可能看起来像这样
Foo1 Foo2 Foo3 Foo4 Foo5
xyz zyx abc def ghi
将是:
Foo1, xyz
Foo2, zyx
Foo3, abc
Foo4, def
Foo5, ghi
我不确定如何做到这一点。似乎可能有一个linq查询来做到这一点。任何帮助将不胜感激。
朗达
答案 0 :(得分:4)
也许(如果表包含更多行,也可以工作):
IList<Foo> data = table.AsEnumerable()
.SelectMany(r => table.Columns.Cast<DataColumn>()
.Select(col => new Foo
{
Name = col.ColumnName,
Value = r.IsNull(col) ? null : r[col].ToString()
}))
.ToList();
答案 1 :(得分:0)
看起来像经典SQL columns to rows task。我添加了列ID,因此您可以将此查询用于多行:
var dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Foo1");
dt.Columns.Add("Foo2");
dt.Rows.Add(1, "xyz", "abc");
dt.Rows.Add(2, "cds", "tgf");
var q = from row in dt.Rows.Cast<DataRow>()
from col in dt.Columns.Cast<DataColumn>()
select new {
ID = row["ID"],
Name = col.ColumnName,
Value = row.IsNull(col) ? null : row[col]
};
q.ToList()
ID, Name, Value
1 Foo1 xyz
1 Foo2 abc
2 Foo1 cds
2 Foo2 tgf
或者,如果你想创建一个词典
q.ToDictionary(x => new { x.ID, x.Name}, x => x.Value)