按用户定义对象的单个属性在LINQ / List中分组

时间:2013-09-09 00:19:49

标签: vb.net linq list group-by

我在网上搜索过,无法通过使用LINQ或仅在对象列表中使用group by来掌握组。我需要按列表中对象的属性进行分组,以便它组合每个位置的数量(删除重复数据)。

让我们说列表对象就是这个     物业网站     物业数量

列表包含

Item(0).Site = 001
Item(0).Quantity = 100
Item(1).Site = 001
Item(1).Quantity = 200
Item(2).Site = 002
Item(2).Quantity = 100
Item(3).Site = 002
Item(3).Quantity = 200

我需要按网站分组,以便在最终列表中以此结尾

Item(0).Site = 001
Item(0).Quantity = 300
Item(1).Site = 002
Item(1).Quantity = 300

我使用VB.Net和List(Of CustomDT)确实包含上述​​2个属性以及其他属性。

1 个答案:

答案 0 :(得分:1)

如果您了解如何在SQL中进行分组,那就不难了。对我来说,最好的是通过例子来理解。下面我只是动态创建两个人并将它们放入一个集合中。我的结果是获得按年龄分组的人员列表。所以你有KeySelector,你正在使用它作为GroupBy操作的键,ElementSelector是你要概括的元素的IEnumerable(Of T),最后记录选择器用于组合Key和the和IEnumerable成新值。我们要记住,当您使用ValueObjects或Dynamic Objects时,您需要确保覆盖GetHash和Equals To。我已经写过关于为ExpandoObject创建一个比较器的博客,其中包含指向GitHub的链接以获取示例代码,您希望这样做。如果是这种情况,则必须在RecordSelector之后添加一个比较器。我希望这有帮助。

http://wysnet.blogspot.com/2013/08/comparer-for-expandoobject.html?view=magazine

    Dim person1 As Object = New Dynamic.ExpandoObject
    person1.Name = "John"
    person1.Age = 10


    Dim person2 As Object = New Dynamic.ExpandoObject
    person2.Name = "Jake"
    person2.Age = 10

    Dim people As New List(Of Object)
    people.AddRange({person1, person2})

    Dim personByAge = people.GroupBy(keySelector:=Function(i) i.Age,
                                     elementSelector:=Function(e) e.Name,
                                     resultSelector:=Function(k, e)
                                                         Dim groupbyItem As Object = New Dynamic.ExpandoObject
                                                         groupbyItem.Key = k
                                                         groupbyItem.People = New List(Of String)(e)
                                                         Return groupbyItem
                                                     End Function)