gpt4 book ai didi

c# - 泛型传递类型成员以对泛型集合进行操作

转载 作者:太空宇宙 更新时间:2023-11-03 21:43:19 26 4
gpt4 key购买 nike

我正在创建一个函数,它将采用一些 IEnumerable,进行分组、排序,采用一些前 N 个元素,并返回这些元素的列表。以后它可能会做更多,这就是为什么我想把它变成一个函数,而不是直接使用 LINQ。

我依靠匿名委托(delegate)来指定类型 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 类型成员进行分组和排序?我在这里使用对象,但有更好的方法吗?

最佳答案

您应该指定组和选择键作为通用参数,而不是指定 object。它们的类型将根据用法自动推断出来,调用者可以指定具有任何返回类型的 lambda。

public IEnumerable<T> GetList<TGroupKey, TOrderKey>(IEnumerable<T> collection, 
Func<T, TGroupKey> groupBy,
Func<T, TOrderKey> orderBy,
int howMany)
{
var group = collection
.GroupBy(groupBy)
.Select(x => x.OrderBy(orderBy).Take(howMany))
.Aggregate((l1, l2) => l1.Concat(l2));
return group.ToList();
}

关于c# - 泛型传递类型成员以对泛型集合进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18260625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com