是否有Linq等效项用于从先前集合中使用的对象的子集创建集合

时间:2014-07-11 13:56:25

标签: c# linq

以下代码是否存在Linq等效项,其中Properties是对象T中的属性列表,而entry是T的实例。

我发现我经常这样编码,我想知道是否有更简单明了的方法来使用linq。

List<Object> args = new List<Object>();
for (int i = 0; i < Properties.Count; i++)
    args.Add(typeof(T).GetProperty(Properties[i]).GetValue(entry));

4 个答案:

答案 0 :(得分:1)

这应该是等效的,使用Select方法:

var args = Properties
    .Select(p => typeof(T).GetProperty(p))
    .Select(p => p.GetValue(entry))
    .ToList();

你当然可以将整个typeof(T).GetProperty(p).GetValue(entry)部分放在一个Select中 - 我为了清楚起见将其拆分了。请注意,它在内存/性能方面没有太大区别 - 它不会在中间创建任何额外的集合,因为LINQ被懒惰地评估,并且在ToList调用之前它不会“运行”。

答案 1 :(得分:1)

您正在将属性转换为值,这意味着您可以使用Select方法:

var args = Properies.Select( p => typeof(T).GetProperty(p).GetValue(entry) );

答案 2 :(得分:1)

var args = Properties
           .Select(x=> typeof(T).GetProperty(x).GetValue(entry))
           .ToList();

答案 3 :(得分:1)

Properties.Select(t => typeof(T).GetProperty(t).GetValue(entry)).ToList();

现在如果经常使用,只需创建一个扩展方法(在静态助手类中)

public static IList<object> GetValuesFor<T>(this IEnumerable<string> properties, T instance) {
   return properties.Select(t => typeof(T).GetProperty(t).GetValue(instance)).ToList();
}

和用法

var args = Properties.GetValuesFor(entry);