Linq:Xml到IEnumerable <keyvaluepair <int,string =“”>&gt;延迟执行?</keyvaluepair <int,>

时间:2010-08-06 15:48:51

标签: c# xml linq .net-3.5 deferred-execution

我正在尝试将下面的Roles拉出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()强制执行语句,但似乎应该有更好的方法。

2 个答案:

答案 0 :(得分:2)

projectContact.Roles将是IEnumerable<KeyValuePair<int, string>>是你想要的,还是你想要它作为List或DIctionary?对于List,只需在语句末尾添加.ToList()

对于词典,它有点棘手:

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

更新:在您的评论中,您声明角色为IEnumerable<KeyValuePair<int, string>>。从技术上讲,这可能是一个词典或一个列表,虽然在前一种情况下,你真的不能通过该接口使用它的Dictionary-ness。就此而言,在后一种情况下你可以使用它的大部分列表 - 但似乎你特别不想要那种能力。

所以,坚持.ToList();。它将是幕后的List,但是如果没有额外的长度,用户仍然只能将它用作IEnumerable。

答案 1 :(得分:2)

如果.Roles的数据类型是数组,则只需在.ToArray()之后附加.Select(),这样可以确保执行查询。

无论哪种方式,您都可以执行ToList().ToArray(),然后执行查询。