对 IList进行排序

本文关键字:排序 IList | 更新日期: 2023-09-27 17:57:18

如果我有一个List<T>,我可以在适当的位置排序,

例如
myList.Sort((x,y) => x.MyComparisonMethod(y));

如果我有IList<T>,我可以使用

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue);

如何就地对IList<T>进行排序?

我正在使用 C# .NET 4.5.1。

对 IList<T >进行排序

使用 ArrayList.Adapter 作为包装器编写您自己的扩展方法IList<T>并从某个比较委托开始编写您自己的CustomComparer

public static class IListExtensions
{
    public static void Sort<T>(this IList<T> list, Comparison<T> comparison)
    {
        ArrayList.Adapter((IList)list).Sort(new CustomComparer<T>(comparison));
    }
}

"我可以使用"不,事实并非如此,OrderBy不返回列表,则必须调用ToList才能创建新列表。您的问题是如何将List.SortIList<T>一起使用而不是List<T>

您可以为IList<T>编写扩展方法:

public static IList<T> Sort<T>(this IEnumerable<T> sequence, IComparer<T> comparer = null)
{
    var seqList = sequence as List<T>;
    if (seqList != null)
    {
        seqList.Sort((IComparer<T>)comparer);
        return seqList;
    }
    var seqArray = sequence as T[];
    if (seqArray != null)
    {
        Array.Sort(seqArray, (IComparer<T>)comparer);
        return seqArray;
    }
    return sequence.OrderBy(t => t, (IComparer<T>)comparer).ToList();
}

现在,您可以在列表、数组或任何其他类型的序列上使用Sort

IList<string> strings = new[] { "B", "A", "C" };
strings.Sort();

更新:如果您只想为数组或列表提供一个,您可以使用:

public static void Sort<T>(this IList<T> sequence, IComparer<T> comparer = null)
{
    var seqList = sequence as List<T>;
    if (seqList != null)
    {
        seqList.Sort((IComparer<T>)comparer);
        return;
    }
    var seqArray = sequence as T[];
    if (seqArray != null)
    {
        Array.Sort(seqArray, (IComparer<T>)comparer);
    }
}

我怀疑你指的是你的OrderBy不会编译的事实。那是因为它返回一个IOrderedEnumerable,这不是一个IList,你必须在之后执行ToList()才能将其转换回IList实现:

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue).ToList();

如果您想使用自己的IComparer

var sortedIList = unsortedIList.OrderBy(x => x.SortingValue, new MyComparer()).ToList();