在VB.Net中实现自定义GroupBy函数

时间:2017-08-28 07:57:06

标签: vb.net linq

我正在尝试以一种通用的方式实现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)

如果我然后执行OrderBySelect它似乎返回IGrouping,这是我所期望的,只有data中的两个数据行对象仍未分组,即使它们是相同的。我没有google-fu,有人可以帮忙吗?

1 个答案:

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