是否可以创建一个扩展方法来返回对象列表中的单个属性或字段?
目前我有很多函数,如下所示:
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);
这种方法是否比直接使用Select
和ToList
更好,这是值得怀疑的。
是的,不需要反射:
List<int> values = motions.Select(m=>m.Speed).ToList();
for循环是我认为最快的,紧随其后的是linq(如果你不使用闭包,开销最小)。我想不出还有比这更好的机制了。
您可以将List<int>
替换为int[]
或初始化具有一定容量的列表。这可能比其他任何方法都更能加快代码的速度(尽管仍然不多)。