2010-05-06 2 views
65

Я хочу заказать список объектов в C# по многим полям, а не по одному. Например, давайте предположим, что у меня есть класс с именем X с двумя атрибутами, А и В, и у меня есть следующие объекты, в таком порядке:Заказать список (C#) по многим полям?

object1 => A = «а», В = «ч»
object2 => а = "а", В = "с"
object3 => а = "Ъ", В = "х"
object4 => а = "Ъ", В = "б"

и я хочу, чтобы упорядочить список атрибутом первой, и когда они равны, по B элемента, так что порядок будет:

«а» «с»
«а» «ч»
«б», «б»
«б», «х»

Насколько я знаю, метод OrderBy порядок одним параметром.

Вопрос: Как я могу заказать список C# более чем одним полем?

Большое спасибо

ответ

201

Использование ThenBy:

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

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

+1

Это не заказ для меня? Что мне не хватает? Docs.OrderBy (o => o.AcctNum) .ThenBy (o => o.DocDate); –

+0

Возможно, вы используете более старую .net. Проверьте этот ответ: http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y/289040#289040. –

+1

Для потомков: OrderBy не сортирует исходную коллекцию, возвращает IOrderedEnumerable , поэтому вам нужно назначить результаты OrderBy переменной. например customers = customers.OrderBy (c => c.Surname) .ThenBy (c.Forename) .ToList(); – CptCoathanger

6

Сделайте свой объект что-то вроде

public class MyObject : IComparable 
{ 
    public string a; 
    public string b; 

    virtual public int CompareTo(object obj) 
    { 
     if (obj is MyObject) 
     { 
      var compareObj = (MyObject)obj; 
      if (this.a.CompareTo(compareObj.a) == 0) 
      { 
       // compare second value 
       return this.b.CompareTo(compareObj.b); 
      } 
      return this.a.CompareTo(compareObj.b); 
     } 
     else 
     { 
      throw new ArgumentException("Object is not a MyObject "); 
     } 
    } 
} 

также отметить, что возвращается на CompareTo:

http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx

Тогда, если у вас есть список MyObject, вызовите .Sort() т.е.

var objList = new List<MyObject>(); 
objList.Sort(); 
+0

Вопрос: Как я могу заказать список C# более чем одним полем? ДА! –

0

Ваш объект должен реализовать интерфейс IComparable.

С его помощью ваш класс становится новой функцией, называемой CompareTo(T other). Внутри этой функции вы можете провести любое сравнение между текущим и другим объектом и вернуть целочисленное значение, если первое больше, меньше или равно второму.

24

Да, вы можете сделать это, указав метод сравнения. Преимущество сортированного объекта не обязательно должно быть IComparable

aListOfObjects.Sort((x, y) => 
    { 
     int result = x.A.CompareTo(y.A); 
     return result != 0 ? result : x.B.CompareTo(y.B); 
    }); 
Смежные вопросы