在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下一篇: How do I get a distinct, ordered list of names from a DataTable using LINQ?