所以今天我遇到了一个有趣的问题.我们有一个返回IList的WCF Web服务.在我想对它进行排序之前,这并不是什么大问题.
结果是IList接口没有内置的排序方法.
我最终使用该ArrayList.Adapter(list).Sort(new MyComparer())
方法来解决问题,但它对我来说似乎有点"贫民窟".
我玩弄了一个扩展方法,也继承了IList并实现了我自己的Sort()方法以及转换为List,但这些方法似乎都不太优雅.
所以我的问题是,有没有人有一个优雅的解决方案来排序IList
您可以使用LINQ:
using System.Linq; IListlist = new List (); IEnumerable sortedEnum = list.OrderBy(f=>f.Bar); IList sortedList = sortedEnum.ToList();
这个问题激发了我写博客的一篇文章:http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/
我认为,理想情况下,.NET Framework将包含一个接受IList
public static class SortExtensions { // Sorts an IListin 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进行排序:
IListiList = 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/
如何使用LINQ To Objects为您排序?
假设你有IList
,并且汽车Engine
有财产,我相信你可以按如下方式排序:
from c in list orderby c.Engine select c;
编辑:你需要快速在这里得到答案.由于我提出了与其他答案略有不同的语法,我将留下我的答案 - 但是,所提出的其他答案同样有效.
你将不得不做我认为的事情(将其转换为更具体的类型).
也许把它放到一个T而不是ArrayList的列表中,这样你就可以获得类型安全性和更多选项来实现比较器.