2010-10-02 3 views
9

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

Пусть это моя IList:

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

Как сортировать myobj с помощью строки маркера?

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

Является ли 'myobj' всегда« списком »? Если это так, вы можете отправить его в «Список» и запустить свою функцию «Сортировка». – Gabe

ответ

16

Использование 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(); 
+0

Спасибо @Bruno, это помогает. – Rye

+1

+1 для рассмотрения чувствительности к регистру, но в Framework уже есть несовместимые с регистрами строки, нет необходимости создавать их. Попробуйте StringComparer.OrdinalIgnoreCase вместо вашего CaseInsensitiveComparer. – Joe

0
var sorted = myObj.OrderBy(x => x.marker); 
0

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

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

9

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

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

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

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

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