如何在对象列表中收集单个属性



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

目前我有很多函数,如下所示:

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表达式树)来创建这样的方法?

你可以这样做:

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);

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

是的,不需要反射:

List<int> values = motions.Select(m=>m.Speed).ToList();

for循环是我认为最快的,紧随其后的是linq(如果你不使用闭包,开销最小)。我想不出还有比这更好的机制了。

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

相关内容

  • 没有找到相关文章

最新更新