Как я могу отсортировать список <T>на основе свойств T? - PullRequest
15 голосов
/ 03 марта 2009

Мой код выглядит так:

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

if(_isAlphabeticalSoting)
   Sort optionInfoList

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

Ответы [ 4 ]

26 голосов
/ 03 марта 2009

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

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

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

8 голосов
/ 03 марта 2009

Если вы просто хотите, чтобы 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)));
}
2 голосов
/ 21 сентября 2011
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);
    }
);
1 голос
/ 03 марта 2009

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

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

...