以泛型方式传递类型成员以对泛型集合进行操作

本文关键字:泛型 操作 集合 成员 方式传 类型 | 更新日期: 2023-09-27 18:27:46

我正在创建一个函数,它将接受一些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的成员进行分组和排序?我在这里使用object,但有更好的方法吗?

以泛型方式传递类型成员以对泛型集合进行操作

不应该指定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();
}

我同意Samuel使用泛型parmater类型。同样,为什么不使用SelectMany来压平结果,并使其成为一种扩展方法呢?

static class GetListExtensionMethods
{
    public static IEnumerable<T> GetList<T, TGroupingField, TOrderingField>(this IEnumerable<T> collection, Func<T, TGroupingField> groupBy, Func<T, TOrderingField> orderBy, int howMany)
    {
        var group = collection
            .GroupBy(groupBy)
            .SelectMany(x => x.OrderBy(orderBy).Take(howMany));
        return group.ToList();
    }
}