【问题标题】:How to cast IEnumerable to anonymous type with selected fields如何将 IEnumerable 转换为具有选定字段的匿名类型
【发布时间】:2015-03-03 10:52:15
【问题描述】:

所以,我有一些字符串数组:

第 1 列 第三列

我有字段类

class A
{
 object Column1;
 object Column2;
 object Column3;
 object Column4;
 object Column5; 
}

现在我有一个 A 对象列表

List<A> ListOfA = new List<A>();

该列表有 N 个元素。

现在,我如何将它转换为该数组中的某个对象?还有List&lt;NewAnonymous&gt;

我想要new { Column1 = '', Column3=''} 的列表,但我不知道该数组中有哪些列。

这甚至可能吗?如果是的话,我在哪里可以找到它。我当然有一些代码,但我认为它无济于事,所以我只是试图解释我想说的话

【问题讨论】:

  • ListOfA.Select(d =&gt; new { Column1 = d.Column1, Column3=d.Column3} )?
  • 但是如果 Array 中有 3 列呢?还是 1?还是99999?我永远不知道有多少列与数组一起来到这里
  • 那么不要将列声明为属性,而是有一个列表的列表?
  • 我别无选择,我必须以我得到的数据为基础
  • 然后我会说使用反射并建立一个列表的列表

标签: c# linq casting ienumerable


【解决方案1】:

基于我建议的问题的 cmets:

foreach (A a in listOfA)
{
    var t = typeof(A);
    List<object> list = new List<object>();

    foreach (var prop in t.GetProperties())
    {
        list.Add(prop.GetValue(a));

    }
    newListOfA.Add(list);
}

编辑: 如果您更喜欢非基于查询的 LINQ,这里是 EarthEngine 的 LINQ 的扩展

t = typeof(A)
listOfA.SelectMany(o=>t.GetProperties().Select(i=>i.GetValue(o))
【解决方案2】:

与默多克的答案相同,但使用纯 LINQ

from a in listOfA
let t = typeof(A)
from prop in t.GetProperties()
select prop.GetValue(a)

【讨论】:

    【解决方案3】:

    我要逆势而上,说你可以通过反思来做到这一点,但你不应该这样做。

    为什么?因为现在你有一个匿名类型,你不“知道”它的属性。你将如何使用下游?更多反思?

    如果您有未知数量的字段,最好以索引方式(列表或字典)处理它们,而不是反射的下沉。

    【讨论】:

    • 另一个选项可能是Dynamic 对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多