Заказать список (С#) по многим полям?

Я хочу заказать список объектов в С# по многим полям, а не по одному. Например, допустим, что у меня есть класс под названием X с двумя атрибутами, A и B, и у меня есть следующие объекты в следующем порядке:

object1 = > A = "a", B = "h"
object2 = > A = "a", B = "c"
object3 = > A = "b" , B = "x"
object4 = > A = "b" , B = "b"

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

"a" "c"
"a" "h"
"b" "b"
"b" "x"

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

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

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

Ответ 2

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

   aListOfObjects.Sort((x, y) =>
   {
       int result = x.A.CompareTo(y.A);
       return result != 0 ? result : x.B.CompareTo(y.B);
   });

Ответ 3

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

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();

Ответ 4

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

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