Linq:将数据表行转换为Dictionary <string,dictionary <string,=“”string =“”>&gt; </string,>

时间:2011-08-25 21:11:08

标签: linq

我有一个包含“a”,“b”,“c”列的数据表。 a和b是我的查找键,所以我想找到c。

我想使用linq将其转换为Dictionary<a, Dictionary<b, c>>(或ILookup)

这可能吗?

我能提出的壁橱解决方法是:

var lookup = resultTable.AsEnumerable().ToLookup(row => row["a"] & row["b"], 
                                               row => row["c"]);

然后我可以连接a + b以用作关键字。

有没有更好的方法,或者这可能更快,因为它是一个更简单的数据结构?

2 个答案:

答案 0 :(得分:2)

这是你可以在C#中实现的一种方式:

var dict = resultTable.AsEnumerable()
    .GroupBy(row => row.Field<A>("a"))
    .ToDictionary(
        g => g.Key,
        g => g.ToDictionary(
            row => row.Field<B>("b"),
            row => row.Field<C>("c")
        )
    );

等效的VB:

Dim dict = resultTable.AsEnumerable               
    .GroupBy(Function(row) row.Field(Of A)("a"))  
    .ToDictionary(                               
        Function(g) g.Key,                       
        Function(g) g.ToDictionary(              
            Function(row) row.Field(Of B)("b"),  
            Function(row) row.Field(Of C)("c")   
        )                                        
    )

答案 1 :(得分:0)

坦率地说,我认为你应该争取Dictionary<Tuple<A, B>, C>

var dict = resultTable.AsEnumerable()
                      .GroupBy(row => Tuple.Create(
                                          row.Field<A>("a"), 
                                          row.Field<B>("b")
                                      )
                      )
                      .ToDictionary(
                          group => group.Key,
                          group => group.Single().Field<C>("c")
                      );
相关问题