【问题标题】:LINQ list property to array?LINQ列表属性到数组?
【发布时间】:2011-11-07 19:55:37
【问题描述】:

如果PROPNAME 可以是T 类型的任何属性,那么最好的方法是什么?用反射构建它,还是有一个很好的 LINQ 方法来做到这一点?

T[] vals = people.Select(x => x.PROPNAME).ToArray<T>();

这是我目前为止最好的:

    public T[] ConvertListCol<TFrom,T>(IEnumerable<TFrom> list, string col)
    {
        var typ = typeof (TFrom);
        var props = typ.GetProperties();
        var prop = (from p in props where p.Name == col select p).FirstOrDefault();
        var ret = from o in list select prop.GetValue(o, null);
        return ret.ToArray<T>();
    }

返回时出错...但越来越近了。没关系,但比我希望的要混乱一些。

【问题讨论】:

  • 你是在寻找people的属性名数组吗?
  • 您是否正在尝试制作一段可重用的代码,您可以在其中指定任何属性并取回字符串表示形式?
  • 情况是有一个包含许多属性的大型 poco 对象,API 希望一次看到一列而不是一次看到一行。
  • 何时知道 Propname:设计时间、编译时间、运行时间?
  • propname 在编译时是已知的,但是,我面临着 n 个 LINQ 语句的 switch 语句,或者基于反射的东西。希望有一些更聪明的效率和优雅的东西。

标签: c# arrays linq


【解决方案1】:

使用非显式的 var 类型,它会自动为你生成类型

var names = people.Select(x => x.PROPNAME).ToArray();

【讨论】:

    【解决方案2】:

    如果使用 var 关键字,将推断类型:

    var names = people.Select(x => x.PROPNAME).ToArray();
    

    【讨论】:

    • 没有基于字符串重命名 PROPNAME 的动态方法。请参阅我在最近的编辑中放在那里的新信息“prop.GetValue(”。这是一个答案,但是,它并不是那么有效。
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多