通用集合的参数

时间:2014-03-30 07:40:24

标签: c# sorting properties params

我想从派生类中对基类中的公共列表进行排序 每个派生类按不同的属性排序。

因此我使用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”以来这是不可能的。

有什么想法吗?

1 个答案:

答案 0 :(得分: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);