我正在尝试以一种通用的方式实现GroupBy功能,并且我们不会在每次客户想要添加/更改某些内容时都不得不继续添加属性(是的,我知道还有其他选项。时间/预算将范围限制在此范围或硬编码更多属性,因此我尝试选择更好的解决方案。)
目前我有以下内容;
<!-- language: lang-vb -->
Dim groupByColumns = New Dictionary(Of String, Boolean) From {
{"Col1", True},
{"Col2", False},
...
}
Dim groupedData = data.GroupBy(Function(r)
Dim groupingResult = New List(Of KeyValuePair(Of String, Object))
For Each column In groupByColumns
Dim groupingValue As Object = Nothing
If column.Value Then
groupingValue = TypeDescriptor.GetProperties(r).Item(grouping.Key).GetValue(r)
End If
groupingResult.Add(New KeyValuePair(Of String, Object)(column.Key, groupingValue))
Next
Return groupingResult
End Function)
如果我然后执行OrderBy
或Select
它似乎返回IGrouping
,这是我所期望的,只有data
中的两个数据行对象仍未分组,即使它们是相同的。我没有google-fu,有人可以帮忙吗?
答案 0 :(得分:1)
您可以将字段组合成一个键(可能是一个字符串),然后按该值分组:
<!-- language: lang-vb -->
Dim groupedData2 = data.GroupBy(Function(r)
Dim groupKey As New List(Of String)
For Each column In groupByColumns
If column.Value Then
Dim p = r.GetType().GetProperties().FirstOrDefault(Function(p) p.Name = column.Key)
Dim groupingValue = p?.GetValue(r)
groupKey.Add(groupingValue)
End If
Next
Return String.Join(",", groupKey)
End Function)