Как я могу сортировать List <T> на основе свойств T?

Мой код выглядит следующим образом:

Collection<NameValueCollection> optionInfoCollection = ....
List<NameValueCollection> optionInfoList = new List<NameValueCollection>();
optionInfoList = optionInfoCollection.ToList();

if(_isAlphabeticalSoting)
   Sort optionInfoList

Я попробовал optionInfoList.Sort(), но он не работает.

Ответы

Ответ 1

Используя метод сортировки и лямбда-выражения, это очень просто.

myList.Sort((a, b) => String.Compare(a.Name, b.Name))

В приведенном выше примере показано, как сортировать по свойству Name вашего типа объекта, предполагая, что Name имеет строку типа.

Ответ 2

Если вы просто хотите, чтобы Sort() работал, тогда вам нужно реализовать IComparable или IComparable<T> в классе.

Если вы не возражаете против создания нового списка, вы можете использовать методы расширения OrderBy/ToList LINQ. Если вы хотите отсортировать существующий список с более простым синтаксисом, вы можете добавить несколько методов расширения, включив:

list.Sort(item => item.Name);

Например:

public static void Sort<TSource, TValue>(
    this List<TSource> source,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y)));
}
public  static void SortDescending<TSource, TValue>(
    this List<TSource> source,
    Func<TSource, TValue> selector)
{
    var comparer = Comparer<TValue>.Default;
    source.Sort((x, y) => comparer.Compare(selector(y), selector(x)));
}

Ответ 3

public class Person  {
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

List<Person> people = new List<Person>();

people.Sort(
    delegate(Person x, Person y) {
        if (x == null) {
            if (y == null) { return 0; }
            return -1;
        }
        if (y == null) { return 0; }
        return x.FirstName.CompareTo(y.FirstName);
    }
);

Ответ 4

Вам нужно настроить компаратор, который сообщает Sort(), как упорядочить элементы.

Посмотрите List.Sort Method (IComparer) для примера того, как это сделать...