在C#中对IList进行排序

所以我今天遇到了一个有趣的问题。 我们有一个返回IList的WCF Web服务。 直到我想对它进行分类才算真正的大事。

原来IList接口没有内置的排序方法。

我结束了使用ArrayList.Adapter(list).Sort(new MyComparer())的方法来解决这个问题,但它只是似乎有点“贫民窟”给我。

我玩弄了一个扩展方法,同时继承自IList并实现我自己的Sort()方法以及转换为List,但没有一个看起来过于优雅。

所以我的问题是,有没有人有一个优雅的解决方案来排序IList


如何使用LINQ To Objects为你排序?

假设你有一个IList<Car> ,并且该车有一个Engine属性,我相信你可以按如下方式排序:

from c in list
orderby c.Engine
select c;

编辑:你需要快速在这里得到答案。 正如我对其他答案的语法略有不同,我会留下我的答案 - 但是,其他答案同样有效。


你可以使用LINQ:

using System.Linq;

IList<Foo> list = new List<Foo>();
IEnumerable<Foo> sortedEnum = list.OrderBy(f=>f.Bar);
IList<Foo> sortedList = sortedEnum.ToList();

这个问题激发了我写博客文章:http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

我认为,理想情况下,.NET Framework将包含一个接受IList <T>的静态排序方法,但下一个最好的方法是创建您自己的扩展方法。 创建几个方法并不难,因为您可以像列表<T>那样对IList <T>进行排序。 作为奖励,您可以使用相同的技术重载LINQ OrderBy扩展方法,因此无论您使用List.Sort,IList.Sort还是IEnumerable.OrderBy,都可以使用完全相同的语法。

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

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

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

    public ComparisonComparer(Comparison<T> 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);
    }
}

有了这些扩展,就像列表一样列出你的IList:

IList<string> 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<string> ordered = iList.OrderBy((s1, s2) => s1.Length.CompareTo(s2.Length));

帖子中有更多信息:http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

链接地址: http://www.djcxy.com/p/51323.html

上一篇: Sorting an IList in C#

下一篇: How do I get a distinct, ordered list of names from a DataTable using LINQ?