2010-01-07 87 views
2

短篇小说:我想转换列表/字典成一个匿名对象清单匿名类型在C#

基本上我之前曾是:

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

+1

也许我不明白,但列表和字典实现IEnumerable,所以你的代码应该工作。 – Nate 2010-01-07 21:35:55

+1

短篇故事?提出一个很好的问题并得到一个好的答案。 – 2010-01-07 21:40:59

+0

我已添加说明。 – Rio 2010-01-07 21:43:47

回答

6

由于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>,这意味着您可以使用投影新类型0和item.Value

+0

我认为OP想要属性的名称(以及它如何从项目访问)是动态的。 – 2010-01-07 21:37:09

+0

虽然我可能错了,所以我删除了我的答案。这个问题是非常不清楚的。 – 2010-01-07 21:38:06

+0

你说得很好 - 我用不同的方式阅读,但问题很不明确,所以很难说。 – 2010-01-07 21:39:43

0

这听起来像你只是想从字典中获取值?如果是这样,MyDictionary。 Values应该为你做的伎俩。

0

如果你想建造,在其他地方,另一个匿名对象,是类型兼容您从IEnumerable<Item>产生一个,你能做到这一点通过确保在构造匿名类型有:

  1. 相同数目的成员的
  2. 成员与同类型使用相同的名称
  3. 会员...以相同的顺序

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

现在,为什么你想这样做是超越我,所以我敢肯定,我不明白你的问题。你应该发布更多关于你想做什么的信息。

总之,这里的生产匿名对象,类型兼容的一个从你的IEnumerable代码:

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

由于这遵守上述所有的规则,这将是同类型的你从Linq查询生成的对象。