列表到c#中的匿名类型

时间:2010-01-07 21:33:01

标签: c# list dictionary anonymous-types

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

基本上我以前拥有的是:

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

3 个答案:

答案 0 :(得分:5)

由于List<T>实现IEnumerable<T>,您现有的代码应该以完全相同的方式工作:

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

对于Dictionary<TKey,TValue>,你可以这样做:

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

这是有效的,因为Dictionary<TKey,TValue>实现IEnumerable<KeyValuePair<TKey,TValue>>所以在第二个表达式item中将输入KeyValuePair<TKey,TValue>,这意味着您可以使用item.Key投影新类型和item.Value

答案 1 :(得分:0)

听起来你只想从字典中获取值?如果是这样,MyDictionary。Values应该为你做到这一点。

答案 2 :(得分:0)

如果你想在其他地方构建另一个匿名对象,它与你从IEnumerable<Item>生成的对象类型兼容,你可以通过确保你构造的匿名类型具有:

  1. 相同数量的成员
  2. 具有相同类型的成员
  3. 同名会员
  4. ...以相同的顺序
  5. 如果你这样做,他们将映射到相同的单一生成类型。

    现在,为什么你想要这样做是超出我的,所以我很确定我不明白你的问题。您应该发布有关您想要做的事情的更多信息。

    无论如何,这里是生成一个与IEnumerable中的类型兼容的匿名对象的代码:

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

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