2017-08-28 41 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