2017-08-28 178 views
0

我试图以通用的方式实现GroupBy函数,并且每次客户端需要添加/更改某些内容时都不必保持添加属性(是,我知道还有其他的选择,有限的时间/预算将范围限制在这个范围或硬编码更多的属性,所以我试图选择更好的解决方案)。在VB.Net中实现自定义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

您可以通过该值相结合的领域,以组为一个键(可能是一个字符串),然后组:

<!-- 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) 
+0

当然!这是诀窍,谢谢。 – Trent