将DataTable转换为IList

时间:2013-08-08 22:37:00

标签: linq ilist

我正在更新一些只包含一行的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查询来做到这一点。任何帮助将不胜感激。

朗达

2 个答案:

答案 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)