Этот вопрос уже имеет ответ здесь:
Я хочу заказать Список объектов в C# многими полями, не только одним. Например, давайте предположим, что у меня есть класс, названный X с двумя Атрибутами, A и B, и у меня есть следующие объекты в том порядке:
object1 => =, B = "h"
object2 => =, B = "c"
object3 => = "b", B = "x"
object4 => = "b", B = "b"
и я хочу заказать список атрибутом сначала, и когда они, равняется, элементом B, таким образом, порядок был бы:
"a" "c"
"a" "h"
"b" "b"
"b" "x"
Насколько я знаю, порядок метода OrderBy одним параметром.
Вопрос: Как я могу заказать Список C# больше чем одним полем?
Большое спасибо
Используйте ThenBy
:
Customer.OrderBy (c => c.LastName) .ThenBy (c => c.FirstName )
См. MSDN: http://msdn.microsoft.com/en-us/library/bb549422.aspx
Сделайте свой объект чем-то вроде
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();
Ваш объект должен реализовывать Интерфейс IComparable .
С его помощью ваш класс становится новой функцией с именем CompareTo (T other)
. В этой функции вы можете произвести любое сравнение между текущим и другим объектом и вернуть целочисленное значение о том, больше ли первое, меньше или равно второму.
Да, вы можете сделать это, указав метод сравнения. Преимущество в том, что сортируемый объект не обязательно должен быть IComparable
aListOfObjects.Sort((x, y) =>
{
int result = x.A.CompareTo(y.A);
return result != 0 ? result : x.B.CompareTo(y.B);
});