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

Этот вопрос вдохновил меня csharp написать сообщение в блоге: http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

Я array-sorting думаю, что в идеале .NET generic Framework должна включать c#.net метод статической сортировки, который ilist принимает IList , но следующий лучший вариант - создать свой собственный метод расширения. Нетрудно создать пару методов, которые позволят вам сортировать IList так же, как и List . В качестве бонуса вы можете перегрузить метод расширения LINQ OrderBy, используя тот же метод, так что независимо от того, используете ли вы List.Sort, IList.Sort или IEnumerable.OrderBy, вы можете использовать точно такой же синтаксис.

public static class SortExtensions
{
    //  Sorts an IList in place.
    public static void Sort(this IList list, Comparison comparison)
    {
        ArrayList.Adapter((IList)list).Sort(new ComparisonComparer(comparison));
    }

    // Sorts in IList in place, when T is IComparable
    public static void Sort(this IList list) where T: IComparable
    {
        Comparison comparison = (l, r) => l.CompareTo(r);
        Sort(list, comparison);

    }

    // Convenience method on IEnumerable to allow passing of a
    // Comparison delegate to the OrderBy method.
    public static IEnumerable OrderBy(this IEnumerable list, Comparison comparison)
    {
        return list.OrderBy(t => t, new ComparisonComparer(comparison));
    }
}

// Wraps a generic Comparison delegate in an IComparer to make it easy
// to use a lambda expression for methods that take an IComparer or IComparer
public class ComparisonComparer : IComparer, IComparer
{
    private readonly Comparison _comparison;

    public ComparisonComparer(Comparison comparison)
    {
        _comparison = comparison;
    }

    public int Compare(T x, T y)
    {
        return _comparison(x, y);
    }

    public int Compare(object o1, object o2)
    {
        return _comparison((T)o1, (T)o2);
    }
}

С помощью c-sharp этих расширений отсортируйте c-sharp свой IList так же, как и c#.net список:

IList iList = new []
{
    "Carlton", "Alison", "Bob", "Eric", "David"
};

// Use the custom extensions:

// Sort in-place, by string length
iList.Sort((s1, s2) => s1.Length.CompareTo(s2.Length));

// Or use OrderBy()
IEnumerable ordered = iList.OrderBy((s1, s2) => s1.Length.CompareTo(s2.Length));

Дополнительная информация sorted в сообщении: http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

c#

generics

sorting

ilist

2022-10-16T05:41:55+00:00