Сортировка IList в C # - PullRequest
       147

Сортировка IList в C #

82 голосов
/ 19 августа 2008

Итак, я столкнулся с интересной проблемой сегодня. У нас есть веб-сервис WCF, который возвращает IList. Ничего страшного, пока я не захотел разобраться.

Оказывается, в интерфейсе IList нет встроенного метода сортировки.

Я решил использовать метод ArrayList.Adapter(list).Sort(new MyComparer()) для решения проблемы, но мне это показалось немного "гетто".

Я поиграл с написанием метода расширения, в том числе с наследованием от IList и реализацией собственного метода Sort (), а также с приведением к списку, но ни один из них не казался слишком элегантным.

Так что мой вопрос: есть ли у кого-нибудь элегантное решение для сортировки IList

Ответы [ 14 ]

0 голосов
/ 06 июля 2009
using System.Linq;

var yourList = SomeDAO.GetRandomThings();
yourList.ToList().Sort( (thing, randomThing) => thing.CompareThisProperty.CompareTo( randomThing.CompareThisProperty ) );

Это красиво! Гетто.

0 голосов
/ 04 февраля 2009

Нашел хороший пост на эту тему и подумал поделиться. Проверьте это ЗДЕСЬ

в основном.

Вы можете создать следующий класс и классы IComparer

public class Widget {
    public string Name = string.Empty;
    public int Size = 0;

    public Widget(string name, int size) {
    this.Name = name;
    this.Size = size;
}
}

public class WidgetNameSorter : IComparer<Widget> {
    public int Compare(Widget x, Widget y) {
        return x.Name.CompareTo(y.Name);
}
}

public class WidgetSizeSorter : IComparer<Widget> {
    public int Compare(Widget x, Widget y) {
    return x.Size.CompareTo(y.Size);
}
}

Тогда Если у вас есть IList, вы можете отсортировать его следующим образом.

List<Widget> widgets = new List<Widget>();
widgets.Add(new Widget("Zeta", 6));
widgets.Add(new Widget("Beta", 3));
widgets.Add(new Widget("Alpha", 9));

widgets.Sort(new WidgetNameSorter());
widgets.Sort(new WidgetSizeSorter());

Но закажите этот сайт для получения дополнительной информации ... Проверьте это ЗДЕСЬ

0 голосов
/ 17 сентября 2008

В VS2008, когда я щелкаю ссылку на службу и выбираю «Настроить ссылку на службу», есть возможность выбрать способ десериализации клиентом списков, возвращаемых из службы.

Примечательно, что я могу выбирать между System.Array, System.Collections.ArrayList и System.Collections.Generic.List

0 голосов
/ 19 августа 2008

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

static void Main(string[] args)
{
    IList list = new List<int>() { 1, 3, 2, 5, 4, 6, 9, 8, 7 };
    List<int> stronglyTypedList = new List<int>(Cast<int>(list));
    stronglyTypedList.Sort();
}

private static IEnumerable<T> Cast<T>(IEnumerable list)
{
    foreach (T item in list)
    {
        yield return item;
    }
}

Функция Cast - это просто переопределение метода расширения, поставляемого с 3.5, написанного как обычный статический метод. Это довольно некрасиво и многословно, к сожалению.

...