List.Sort(пользовательская сортировка...)

У меня есть объект List, который включает в себя 3 элемента: Partial, Full To H и Full To O.

Я привязываю этот список к asp OptionButtonList и сортирую его в алфавитном порядке. Однако я хочу отсортировать список следующим образом:

Полный для H, частичный, полный для O.

Как я могу это сделать?

Ответ 1

Linq отлично подходит для этого. Вы даже можете построить последовательность заказов до того, как она будет определена "на лету", так как выполнение сортировки не выполняется до ToList.

 var sortedList = yourList.OrderBy(i => i.FullToH).
     ThenBy(i => i.Partial).
     ThenBy(i => i.FullToO).ToList();

Ответ 2

Спасибо за помощь!

Я сделал это вот так:

List<string> sortedList = new List<string>();
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList();

Затем привязывается к sortedList!

Ответ 3

Хорошо, я знаю, что это уже несколько лет, но у меня есть альтернативное решение, которое, я думаю, более элегантно, чем вышеупомянутые решения, которые будущие читатели могут захотеть рассмотреть:

В вашем классе:

static readonly List<String> codeValueSortOrder = new List<String> {
    "Full To H", 
    "Partial",
    "Full To O"
};

и в вашем методе:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue));

Ответ 4

Являются ли перечисленные вами элементы (например, FullToHo) только строками? Если это так, все, что вам нужно сделать, это написать метод для сравнения и сортировки с этим методом.

public int CompareEntries(string left, string right) {
  const string fullToH = "Full To H";
  const string partial = "Partial";
  const string fullToO = "Full To O";
  if ( left == right ) {
    return 0;
  } else if ( left == fullToH ) {
    return -1;
  } else if ( left == fullToO ) {
    return 1;
  } else if ( right == fullToH ) {
    return 1;
  } else {
    return -1; 
  }
}

list.Sort(CompareEntries);

Ответ 6

Предполагая, что ваш список не является

 List<object> myList = new List<object>();

но вместо этого что-то вроде

List<MyObjectClass> myList = new List<MyObjectClass>();

(где каждый элемент имеет один и тот же тип объекта)

Вы можете сделать это:

myList.Sort((firstObj, secondObj) =>
    {
        return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty);
    }
);

Ответ 7

Создайте Comparer для вашего настраиваемого типа (который реализует интерфейс IComparer). Затем вы можете использовать это для сортировки списка:

List<CustomType> list = new List<CustomType>();

// Fill list
list.Sort(new CustomComparer());

Или, если вы используете более новую версию фреймворка и не нуждаетесь в повторном использовании логики сортировки, вы можете использовать метод IEnumerable<T>.OrderBy().