Как мне отсортировать IList <Class>? - PullRequest
9 голосов
/ 02 октября 2010

Для IList нет функции Sort().Может ли кто-нибудь помочь мне с этим?Я хочу отсортировать свой собственный IList.

Предположим, это мой IList:

public class MyObject() 
{
 public int number { get; set; }
 public string marker { get; set; }
}

Как мне отсортировать myobj, используя строку маркера?

public void SortObject()
{
 IList<MyObject> myobj = new List<MyObject>();
}

Ответы [ 5 ]

17 голосов
/ 02 октября 2010

Использование OrderBy

Пример

public class MyObject() 
{
    public int number { get; set; }
    public string marker { get; set; }
}

IList<MyObject> myobj = new List<MyObject>();
var orderedList = myobj.OrderBy(x => x.marker).ToList();

В случае нечувствительности к регистру вы должны использовать IComparer

public class CaseInsensitiveComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
    }
}

IList<MyObject> myobj = new List<MyObject>();
var orderedList = myobj.OrderBy(x => x.marker, new CaseInsensitiveComparer()).ToList();
11 голосов
/ 19 октября 2012

Я бы пошел против , используя OrderBy со списком, потому что это метод расширения LINQ, поэтому:

  • Оборачивает список в перечисляемый, затем перечисляет его и заполняет новый временный список, затем сортирует этот новый список.
  • Оборачивает отсортированный список внутри другого перечислимого.
  • Затем, когда вы вызываете ToList(), он перебирает его и заполняет другой новый список элементами.

По сути: он создает и заполняет 2 новых списка и 2 перечислимых в дополнение к фактической сортировке. Для сравнения, List.Sort() сортирует и ничего не создает, так что это намного эффективнее.

Моя рекомендация будет:

  • Если вы знаете базовый тип, используйте List.Sort() или Array.Sort(array)
  • Если вы не знаете базовый тип, скопируйте список во временный массив и отсортируйте его с помощью Array.Sort(array) и верните его.
0 голосов
/ 30 августа 2018

Для объяснения, почему бы не использовать OrderBy или подобную проверку Ответ Кристофа .

Вот одна попытка быстрой сортировки:

public static void Sort<T>(this IList<T> ilist)
{
    switch(ilist)
    {
        case List<T> lst:
            lst.Sort();
            break;
        case Array arr:
            Array.Sort(arr);
            break;
        default:
            throw new NotImplementedException();
            // or add slow impl if you don't want this to fail!!
    }
}
0 голосов
/ 18 февраля 2011

OrderBy определенно выполняет свою работу, но я лично предпочитаю синтаксис List.Sort, потому что вы можете передать ему Comparison<T> делегат вместо того, чтобы писать класс, реализующий IComparer<T>. Мы можем достичь этой цели с помощью метода расширения, и если это то, что вас интересует, посмотрите SortExtensions:

http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

0 голосов
/ 02 октября 2010
var sorted = myObj.OrderBy(x => x.marker);
...