当前位置:  开发笔记 > 编程语言 > 正文

在C#中对IList进行排序

如何解决《在C#中对IList进行排序》经验,为你挑选了4个好方法。

所以今天我遇到了一个有趣的问题.我们有一个返回IList的WCF Web服务.在我想对它进行排序之前,这并不是什么大问题.

结果是IList接口没有内置的排序方法.

我最终使用该ArrayList.Adapter(list).Sort(new MyComparer())方法来解决问题,但它对我来说似乎有点"贫民窟".

我玩弄了一个扩展方法,也继承了IList并实现了我自己的Sort()方法以及转换为List,但这些方法似乎都不太优雅.

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



1> Mark Cidade..:

您可以使用LINQ:

using System.Linq;

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



2> David Mills..:

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

我认为,理想情况下,.NET Framework将包含一个接受IList 的静态排序方法,但下一个最好的方法是创建自己的扩展方法.创建一些允许您按照List 对IList 进行排序的方法并不难.作为奖励,您可以使用相同的技术重载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));
    }

    // 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);
    }
}

使用这些扩展,像对待List一样对IList进行排序:

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));

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


精彩的回答!但是,需要注意的是:这种方法假定`IList list`可以强制转换为非泛型`IList`接口.如果您编写自己的类来实现`IList `接口,请确保您还实现了非泛型`IList`接口,否则代码将因类抛出异常而失败.

3> Brad Leach..:

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

假设你有IList,并且汽车Engine有财产,我相信你可以按如下方式排序:

from c in list
orderby c.Engine
select c;

编辑:你需要快速在这里得到答案.由于我提出了与其他答案略有不同的语法,我将留下我的答案 - 但是,所提出的其他答案同样有效.



4> Leon Bambric..:

你将不得不做我认为的事情(将其转换为更具体的类型).

也许把它放到一个T而不是ArrayList的列表中,这样你就可以获得类型安全性和更多选项来实现比较器.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有