如果我在DataTable
中有3列包含以下数据:
1 A qwqw
2 A wewe
3 B tyty
4 B trtr
5 C iuiu
将上述数据放入Dictionary(Of String, List(Of Foo))
这样的最简单有效的方法是什么:
[A] -> {New Foo(1, A, qwqw), New Foo(2, A, wewe)}
[B] -> {New Foo(3, B, tyty), New Foo(4, B, trtr)}
[C] -> {New Foo(5, C, iuiu)}
其中Foo
是一个类型,其成员表示表中的字段。
我所做的是编写一个查询(LINQ)来首先获取List(Of String)
中第二列中的唯一值。然后遍历此列表以触发列表中每个元素的另一个查询,以获取列表中的相应行,从中创建Foo的对象并将其放入列表中,然后将该列表添加到我的Dictionary
作为值关键作为元素。有什么想法吗?
答案 0 :(得分:2)
这是一个C#答案:
myDataTable.Rows.GroupBy(r => r[1]).ToDictionary(
g => g.Key
, g => g.Select(rr => new Foo(rr[0], rr[1], rr[2])).ToList()
);
我们的想法是首先按中间列(#1)进行分组,然后将组转换为字典,使用组密钥作为字典键,并从组中的每一行创建Foo
。
答案 1 :(得分:1)
感谢dasblinkenlight,我设法将他的C#构造转换为VB.NET:
Dim r as Dictionary(Of String, List(Of String)) = New Dictionary(Of String, List(Of String))
r = myDataTable.AsEnumerable.GroupBy(Function(x) x(1).ToString()).ToDictionary(Function(g) g.Key, Function(g) g.Select(Function(rr) New Foo(rr.Field(Of String)(0), rr.Field(Of String)(1), rr.Field(Of String)(2)).ToList())
它完美无缺。