使用Linq/Lambda将DataTable转换为字典

3
我有一个DataTable,想要在我的项目中将其转换为C#字典。我可以使用传统的编程方式来实现目标,但使用linq/lambda更加优雅。我尝试使用Lambda,但不知道如何将多个行flatten成1个。这里有一个用于测试目的的模拟DataTable。
static DataTable GetData()
{
    DataTable table = new DataTable();
    table.Columns.Add("Field1", typeof(string));
    table.Columns.Add("Field2", typeof(string));

    table.Rows.Add("A", "A1");
    table.Rows.Add("A", "A2");
    table.Rows.Add("B", "B1");
    table.Rows.Add("A", "A3");
    table.Rows.Add("C", "C1");
    table.Rows.Add("D", "D1");
    table.Rows.Add("A", "A5");

    return table;
}

我通常将其转换为字典的传统方法是:

    Dictionary<string, ArrayList> t = new Dictionary<string, ArrayList>();
    foreach (DataRow r in GetData().Rows)
    {
        string k = (string)r["Field1"];
        string v = (string)r["Field2"];
        if (!t.Keys.Contains(r["Field1"]))
        {
            t.Add(k, new ArrayList());
        }
        if (t.Values == null)
        {
            t[k] = new ArrayList();
        }
        t[k].Add(v);
    }

我该如何使用Linq实现同样的功能?

我尝试过:

var res = GetData()
                     .AsEnumerable()
                     .GroupBy(row => row.Field<string>("Field1"))
                     .Select(grp => grp.First());

这只给我第一个项目的出现。我卡住了。请帮忙。

1
不要使用Select,尝试使用ToDictionary并看看你能做到什么。你将会使用grp.Key和grp.ToList()。 - Anthony Pegram
1
您可能想阅读 ArrayList有哪些问题? - Heretic Monkey
实际上,您不想将其转换为 Dictionary,而是要转换为 Lookup - Theodor Zoulias
1
@user1205746 请阅读:Lookup()和Dictionary(Of list())之间的区别,以便您可以决定哪种方法最适合您。 - 41686d6564 stands w. Palestine
1
查找允许高效地搜索键,就像字典一样,但不同于字典的是它可以在每个键上保存多个值。看起来这是您所追求的数据结构。但是它也有一些限制。它是不可变的(只读),每个键的值可作为 Enumerable<T> 访问,而不是索引集合(尽管它们可以转换为 IList<T>,但这是未记录的,因此不具备未来性)。 - Theodor Zoulias
显示剩余3条评论
3个回答

4

实际上,你不想将其转换为字典,而是转换为Lookup。下面是一个例子:

var lookup = GetData().AsEnumerable()
    .ToLookup(r => r.Field<string>("Field1"), r => r.Field<string>("Field2"));
foreach (var grouping in lookup)
{
    Console.WriteLine(grouping.Key + ": " +  String.Join(", ", grouping));
}

输出:

A: A1, A2, A3, A5
B: B1
C: C1
D: D1

2

不使用Linq/Lambda从Datatable中获取数据字典

最初的回答
        DataTable dataTable = GetData();
        var data = new List<Dictionary<string, object>>();
        foreach (DataRow dataTableRow in dataTable.Rows)
        {
            var dic = new Dictionary<string, object>();
            foreach (DataColumn tableColumn in dataTable.Columns)
            {
                dic.Add(tableColumn.ColumnName, dataTableRow[tableColumn]);
            }
            data.Add(dic);
        }


变量data = new List<Dictionary<string, object>>();中的对象可以是任何数据类型吗?@Qamar Zaman - Sovit Maharjan
是的 @SovitMaharjan - Qamar Zaman

0

你可以获得一个集合:

            var res = GetData()
                 .AsEnumerable()
                 .Select(grp => new KeyValuePair<string, string>(grp[0].ToString(), grp[1].ToString()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接