3

我正在更新一些具有仅包含一行的表的旧版。我想将其转换为 IList。这个想法是 IFoo 的第一个属性是 Name ,它是表中的列名,第二个 if 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 查询可以做到这一点。任何帮助,将不胜感激。

朗达

4

2 回答 2

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();
于 2013-08-08T22:43:24.410 回答
0

看起来像经典的 SQL 列到行任务。我添加了列 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)
于 2013-08-09T05:34:22.733 回答