我怎么用这么简单的方式做到这一点?

时间:2012-05-04 04:00:59

标签: .net vb.net list dictionary

如果我在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作为值关键作为元素。有什么想法吗?

2 个答案:

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

它完美无缺。