我在网上搜索过,无法通过使用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个属性以及其他属性。
答案 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)