2014-03-30 91 views
1

我想从它的派生类中对基类中的公共列表进行排序。
每个派生类按不同的属性排序。泛型集合的参数

因此我用this想法:通过相关属性来排序基类列表。

protected void SortBy(Func<MyBaseClass, IComparable> getProp) 
{ 
if (BaseClassList != null && BaseClassList .Count > 0) 
{ 
    BaseClassList = BaseClassList 
        .OrderBy(x => getProp(x)) 
        .ToList(); 
     } 

    } 

而且通过SortBy(x => x.GetTop);

嗯从派生类调用它,现在我想通过几个属性进行排序;对于每个额外发送的属性,应将ThenBy表达式添加到方法主体中。

BaseClassList = BaseClassList 
       .OrderBy(x => getProp(x)) 
       .ThenBy(x => x.getOtherProp) 
       .ToList(); 

因为我不知道有多少属性将被送到我想用params想法。
但是,我知道这是不可能的,因为'The parameter array must be a single dimensional array'。

任何想法?

+0

'PARAMS Func键 [] getters'? –

+0

@AlexeiLevenkov,谢谢。你可以显示代码片段,以便我可以正确理解我应该在方法体中更改哪些内容?提前致谢! – user3165438

回答

0

像这样的东西应该工作:

public static List<T> SortBy<T>(IEnumerable<T> data, Func<T, IComparable> sort, params Func<T, IComparable>[] details) 
    { 
     var result = data.OrderBy(x => sort(x)); 

     foreach(var detail in details) 
     { 
      result = result.ThenBy(x => detail(x)); 
     } 

     return result.ToList(); 
    } 

请注意,我修改了它与任何列表和任何数据类型的工作。你会与你BaseClassList称呼它为第一个参数和返回值再次把结果写入:

BaseClassList = SortBy(BaseClassList, x => x.GetTop, x => x.GetSecondValue, x => x.GetThirdValue); 
+0

非常感谢!大!有没有办法发送通知,如果按asc排序或降序?怎么样?提前致谢! – user3165438