6

是否可以创建扩展方法来返回对象列表中的单个属性或字段?

目前我有很多功能,如下所示。

public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
    List<int> speeds = new List<int>();
    foreach (ObjectMotion motion in motions) {
        speeds.Add(motion.Speed);
    }
    return speeds;
}

这是“硬编码”的,并且仅在单个对象类型中提供单个属性。它很乏味,我确信有一种方法可以使用 LINQ/Reflection 创建一个扩展方法,该方法可以以通用且可重用的方式执行此操作。像这样的东西:

public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){
    List<TProp> props = new List<TProp>();
    foreach (ObjectMotion obj in objects) {
        props.Add(obj.prop??);
    }
    return props;
}

除了使用 LINQ 的最简单方法外,我还在寻找最快的方法。是否可以在运行时使用代码生成(和 Lambda 表达式树)来创建这样的方法?我相信这会比使用反射更快。

4

3 回答 3

7

是的,不需要反思:

List<int> values = motions.Select(m=>m.Speed).ToList();
于 2013-03-12T13:56:09.347 回答
7

你可以这样做:

public static List<TProp> GetProperties<T, TProp>(this IEnumerable<T> seq, Func<T, TProp> selector)
{
    return seq.Select(selector).ToList();
}

并像这样使用它:

List<int> speeds = motions.GetProperties(m => m.Speed);

值得怀疑的是,这种方法是否比直接使用Selectand更好ToList

于 2013-03-12T13:59:16.537 回答
1

我认为 for 循环是最快的,紧随其后的是 linq (如果你不使用闭包,开销最小)。我无法想象任何其他机制会比这更好。

您可以将 替换为List<int>aint[]或使用特定容量初始化列表。这可能比其他任何事情都更能加快您的代码速度(尽管仍然不多)。

于 2013-03-12T14:00:15.913 回答