2010-08-13 22 views
1

這是一個原因請看我剛纔的問題:在管理IEnumerable.GroupBy更有效的方式()

Looking for a better way to sort my List<T>

基本上,我有一個類似的情況下,我需要做一個.GroupBy()大約40個不同的領域。

最初的代碼會使用一個巨大的switch語句,但我想知道是否有更好的方法。

我真正想要做的是一樣的東西:

// not sure what the GroupBy selector function def should be...
Dictionary<PortfolioMapping, Func<Holding, ???>> groupByMappings;

,我可以通過像使用組:

myPortfolioHoldings.GroupBy(groupByMaping[frmGroupBySelector.SelectedColumn]);

什麼是正確的方法去做這個?

回答

1

您應該能夠按object

Dictionary<PortfolioMapping, Func<Holding, object>> groupByMappings; 

這隻要你的映射函數返回工作之一:

  • 的實例內置類型(如數字或字符串)
  • 實現的對象IEquatable<T>
  • 執行對象EqualsGetHashCode正確
+0

謝謝Tim!將測試和確認,但看起來像我正在尋找。 – code4life 2010-08-13 16:06:51

0

那麼,我個人的做法是建立lambda表達式,然後將最終表達式應用到列表中。

我使用了一些擴展方法來Linq.Expression這只是包裝類似如下:

<System.Runtime.CompilerServices.Extension()> _ 
Public Function Compose(Of T)(ByVal first As Expressions.Expression(Of T), ByVal second As Expressions.Expression(Of T), ByVal merge As Func(Of Expressions.Expression, Expressions.Expression, Expressions.Expression)) As Expressions.Expression(Of T) 

    '' build parameter map (from parameters of second to parameters of first) 
    Dim map = first.Parameters.[Select](Function(f, i) New With {f, .s = second.Parameters(i)}).ToDictionary(Function(p) p.s, Function(p) p.f) 

    '' replace parameters in the second lambda expression with parameters from the first 
    Dim secondBody = ParameterRebinder.ReplaceParameters(map, second.Body) 

    '' applycomposition of lambda expression bodies to parameters from the first expression 
     Return Expressions.Expression.Lambda(Of T)(merge(first.Body, secondBody), first.Parameters) 
    End Function 

<System.Runtime.CompilerServices.Extension()> _ 
Public Function [And](Of T)(ByVal first As Expressions.Expression(Of Func(Of T, Boolean)), ByVal second As Expressions.Expression(Of Func(Of T, Boolean))) As Expressions.Expression(Of Func(Of T, Boolean)) 
    Return first.Compose(second, AddressOf Expressions.Expression.And) 
End Function 

然後你就可以建立查詢是這樣的:

Dim MyQuery as Linq.Expressions.Expression(Of System.Func(Of MyListDataType, Boolean)) 
Dim MyGroupingExpression as Linq.Expressions.Expression(Of System.Func(Of MyListDataType, Boolean)) 

Dim MyQuery = Function(x) x.SomeValue = SomeExpectedValue 
Select case SomeOtherVariable 
    Case Option1 
     Dim MyGroupingExpression = <blah> 
    Case Option2 
     Dim MyGroupingExpression = <blah> 
End Select 

Dim Results = MyList.Where(MyQuery.And(GroupingExpression)) 

這是你在做什麼後?