2010-01-07 68 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查詢生成的對象。