Linq OrderBy Any Property - PullRequest
       13

Linq OrderBy Any Property

5 голосов
/ 08 декабря 2010

Я знаю, как заказать одно свойство, затем другое свойство. Мне интересно, есть ли способ linq для заказа по любому свойству (или нескольким свойствам одновременно).

Например, список имен:

   ->Adam     Jones
   ->Dude     Lebowski
   ->Zander   Berry

Будет отсортировано:

   ->Adam     Jones
     Zander ->Berry
   ->Dude     Lebowski

Ответы [ 2 ]

6 голосов
/ 08 декабря 2010

Странно хотеть.

Вы можете передать любой Func , который вам нравится, в OrderBy: -

names.OrderBy(x => x.FirstName.CompareTo(x.LastName) < 0
                     ? x.FirstName
                     : x.LastName);

Или, если вы думаете, что встроенная троичная часть выглядит некрасиво (или если вам нужно повторно использовать сортировку повсеместно), вы можете написать свой собственный IComparer: -

http://msdn.microsoft.com/en-us/library/bb549422.aspx

class PersonFirstOrLastNameComparer : IComparer<Person>
{
  public int Compare( Person x, Person y )
  {
    return GetKey( x ).CompareTo( GetKey( y ) );
  }

  private String GetKey( Person person )
  {
    if ( person.FirstName.CompareTo( person.LastName ) < 0 )
    {
      return person.FirstName;
    }
    else
    {
      return person.LastName;
    }
  }
}

и: -

names.OrderBy(x => x, new PersonFirstOrLastNameComparer());

Правда, я бы советовал против этого. Если вы обнаружите, что сортируете по более раннему из двух свойств в классе модели, я подозреваю, что, скорее всего, ваш класс модели не соответствует задаче.

Я не могу сказать больше, не зная больше о вашем конкретном приложении, но, вероятно, я бы посоветовал либо инкапсулировать эту логику в классе модели (либо предоставив конкретное свойство, например Person.SortKey, либо если это универсальная сортировка путем переопределения CompareTo) или создание модели представления. Фрагменты кода, которые я разместил, были бы немного удивительными в обзоре кода. Я думаю, что сохранение логики с моделью (или ViewModel) прояснит цель.

3 голосов
/ 08 декабря 2010

А как же:

.OrderBy(obj => (obj.PropA < obj.PropB) ? obj.PropA : obj.PropB)
...