是否可以创建一个扩展方法来返回对象列表中的单个属性或字段?
目前我有很多功能如下。
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表达式树)在运行时创建这样的方法?我确信这比使用Reflection更快。
答案 0 :(得分: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);
这种方法是否比直接使用Select
和ToList
更好,这是值得怀疑的。
答案 1 :(得分:6)
不需要反思:
List<int> values = motions.Select(m=>m.Speed).ToList();
答案 2 :(得分:1)
for循环是我认为最快的,紧接着是linq(如果不使用闭包,则开销最小)。我无法想象任何其他机制会比这更好。
您可以将List<int>
替换为int[]
,或者使用特定容量初始化列表。这可能会比其他任何事情更快地加速你的代码(但仍然不多)。