2010-08-06 69 views
1

我想下面的Roles拉出到IEnumerable<KeyValuePair<int, string>>Linq:Xml到IEnumerable <KeyValuePair <int, string>>延期執行?

<PROJECT PROJECT_NO="161917"> 
    <CONTACT CLIENT_ID="030423253272735482765C" CONTACT_NO="1"> 
    <ROLE ROLE_ID="2" ROLE_DESC="ARCHITECT" /> 
    <ROLE ROLE_ID="5" ROLE_DESC="INTEGRATOR" /> 
    </CONTACT> 
</PROJECT> 



private static ProjectContact BuildProjectContactFromXml(XElement xml) 
    { 
     ProjectContact projectContact = new ProjectContact(); 
     projectContact.ProjectId = SafeConvert.ToInt32(xml.Attribute("PROJECT_NO").Value); 
     projectContact.Roles = xml.Elements() 
            .First() 
            .Elements() 
            .Select(role => new KeyValuePair<int, string>(
                  SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value), 
                  role.Attribute("ROLE_DESC").Value)); 

     return projectContact; 
    } 

我的問題是關於這個LINQ的聲明推遲執行。我的理解是,當我返回這個ProjectContact時,Linq語句還沒有執行。有沒有辦法強制執行這個語句,以便它在這個方法中發生,而不是當有人試圖訪問角色時?我想我可以通過調用.Count()來強制執行語句,但似乎應該有更好的方法。

+0

對不起,沒有完成的問題,它張貼!我會寫完我的問題,一分鐘:) – JSprang 2010-08-06 15:49:53

+0

好的,問題現在在那裏。 – JSprang 2010-08-06 15:54:29

+0

角色是IEnumerable >,對此感到遺憾。 – JSprang 2010-08-06 15:59:05

回答

2

projectContact.Roles將是一個IEnumerable<KeyValuePair<int, string>>是你想要的,或者你想要它作爲一個List或DIctionary?對於列表,只需在語句結尾處添加.ToList()即可。

對於字典,這是一個有點棘手:

projectContact.Roles = xml.Elements() 
           .First() 
           .Elements() 
           .ToDictionary(
       role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value), 
       role=> role.Attribute("ROLE_DESC").Value)); 

更新:在你評論,你聲明的角色ID IEnumerable<KeyValuePair<int, string>>。從技術上講,這可能是一個詞典或列表,但在前一種情況下,你真的不能通過該界面使用它的Dictionary-ness。對於這個問題,你可以在後一種情況下使用它的大部分List-ness,但是你似乎並不想要這個能力。

因此,在.ToList();。它將成爲幕後的List,但不會過於冗長,用戶仍然只能將其用作IEnumerable。

+0

在ProjectContact上,我確實希望角色是IEnumerable。原因是我不希望對象的用戶能夠編輯角色集合。如果我將它作爲List或Dictionary,他們將能夠將Add()添加到它。那有意義嗎? – JSprang 2010-08-06 16:07:02

+0

啊,是的!這就說得通了!感謝您的解釋! – JSprang 2010-08-06 16:20:05

+0

@JSPrang:但請注意,「extradinary長度」幾乎只是鑄造... – 2010-08-06 16:22:49

2

如果.Roles的數據類型是數組,則可以簡單地在.Select()之後附加.ToArray(),這樣可以確保執行查詢。

無論採用哪種方式,您都可以執行ToList().ToArray(),您將執行查詢。

相關問題