【问题标题】:List to Anonymous Type in c#在 c# 中列出匿名类型
【发布时间】:2010-01-07 21:33:00
【问题描述】:

小故事:我想将列表/字典转换为匿名对象

基本上我以前有的是:

var model = from item in IEnumerable<Item>
   select new
     {
     name = item.Name
     value = item.Value
     }

等等。 如果我在列表或字典中有name, item.Name,我该如何创建相同的匿名对象model

编辑:澄清: 如果字典包含 [name, item.Name][value, item.Value] 作为键值对,我将如何创建 model 而不假设您既不知道 name 也不知道 value

【问题讨论】:

  • 也许我不明白,但是List和Dictionary都实现了IEnumerable,所以你的代码应该可以工作。
  • 短篇小说?问一个好问题,得到一个好答案。
  • 我不明白这个问题。

标签: c# list dictionary anonymous-types


【解决方案1】:

由于List&lt;T&gt; 实现了IEnumerable&lt;T&gt;,您现有的代码应该以完全相同的方式工作:

var model = from item in yourList
            select new { name = item.Name };

对于Dictionary&lt;TKey,TValue&gt;,您可以这样做:

var model = from item in yourDictionary
            select new {
                name = item.Key
                value = item.Value
            };

这是可行的,因为Dictionary&lt;TKey,TValue&gt; 实现了IEnumerable&lt;KeyValuePair&lt;TKey,TValue&gt;&gt;,因此在第二个表达式中,item 将被键入为KeyValuePair&lt;TKey,TValue&gt;,这意味着您可以使用item.Keyitem.Value 来投射新类型。

【讨论】:

  • 我认为 OP 希望属性的名称(以及从项目中访问它的方式)是动态的。
  • 我可能是错的,因此我删除了我的答案。这个问题非常不清楚。
  • 你说得很好——我读的不同,但问题很不清楚,所以很难说。
  • 但它仍然假设我知道 name = item.Key 中的“名称”
  • 是的 - 我不确定您为什么不知道要创建的属性的名称。
【解决方案2】:

听起来您只是想从字典中获取值?如果是这样,MyDictionary.Values 应该可以为您解决问题。

【讨论】:

    【解决方案3】:

    如果您想在其他地方构造另一个匿名对象,该对象与您从 IEnumerable&lt;Item&gt; 生成的对象类型兼容,您可以通过确保您构造的匿名类型具有以下内容来做到这一点:

    1. 成员数量相同
    2. 同类型成员
    3. 同名成员
    4. ...以相同的顺序

    如果你这样做,它们将映射到同一个生成的类型。

    现在,为什么你会想要这样做,这超出了我的理解,所以我很确定我没有理解你的问题。你应该发布更多关于你想做的事情的信息。

    无论如何,下面是生成匿名对象的代码,该对象与您的 IEnumerable 中的对象类型兼容:

    var x = new
    {
        name = dict["name"],
        value = dict["value"]
    };
    

    由于这符合上述所有规则,因此它将与您从 Linq 查询生成的对象属于同一类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多