Параметри за генерична колекция

Бих искал да сортирам общ списък в базов клас от неговите производни класове.
Всеки производен клас сортира по различно свойство.

Затова използвам тази идея: предайте подходящо свойство, по което да сортирате списъка с базови класове.

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'.

Някакви идеи?


person user3165438    schedule 30.03.2014    source източник
comment
@AlexeiLevenkov, Благодаря. Можете ли да покажете кодов фрагмент, за да мога да разбера правилно какво трябва да променя в тялото на метода? Благодаря предварително!   -  person user3165438    schedule 30.03.2014


Отговори (1)


Нещо подобно трябва да работи:

    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);
person nvoigt    schedule 30.03.2014
comment
Благодаря много! Страхотен! Има ли начин да изпратите известие, ако сортирате по възходящ или низходящ? как Благодаря предварително! - person user3165438; 30.03.2014