【发布时间】:2013-08-15 19:51:35
【问题描述】:
我正在创建一个函数,它将获取一些 IEnumerable、进行分组、排序、获取一些前 N 个元素并返回这些元素的列表。以后它可能会做更多的事情,这就是为什么我想把它变成一个函数而不是直接使用 LINQ。
我依靠匿名委托来指定 T 类型的哪些成员将用于对集合进行分组和排序。
public IEnumerable<T> GetList(IEnumerable<T> collection, Func<T, object> groupBy, Func<T, object> orderBy, int howMany)
{
var group = collection
.GroupBy(groupBy)
.Select(x => x.OrderBy(orderBy).Take(howMany))
.Aggregate((l1, l2) => l1.Concat(l2));
return group.ToList();
}
并像这样使用:
new CollectionGroupPicker<NumericDomainObject>().GetList(list, x => x.GroupableField, x => x.OrderableField, 2).ToList();
我的问题是 - 有没有更好的方法来传递我将使用哪个 T 类型的成员来分组和排序?我在这里使用对象,但是有更好的方法吗?
【问题讨论】:
-
我很难看到“更好的方法”。您的解决方案看起来非常简洁。
-
我建议的唯一更改是制作具有
IEnumerable<T> GetList(IQueryable<T> collection, Expression<Func<T, object>> groupBy, Expression<Func<T, object>> orderBy, int howMany)方法签名的第二个版本,以便您可以将它与LinqToEntities(即:实体框架、LinqToSql 等)一起使用。 (加上像答案建议的那样用另一个通用参数切换object) -
@ScottChamberlain - 谢谢。那是我为了测试而记下的一个愚蠢的 ToList()。更改为返回组。
-
如果您要返回组,并且按照我的建议使用 IQueryable 版本,请务必将返回类型也更改为
IQueryable<T>。
标签: c# linq generics collections anonymous-delegates