Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:Xml到IEnumerable<;KeyValuePair<;int,string>&燃气轮机;延期执行?_C#_Xml_Linq_.net 3.5_Deferred Execution - Fatal编程技术网

C# Linq:Xml到IEnumerable<;KeyValuePair<;int,string>&燃气轮机;延期执行?

C# Linq:Xml到IEnumerable<;KeyValuePair<;int,string>&燃气轮机;延期执行?,c#,xml,linq,.net-3.5,deferred-execution,C#,Xml,Linq,.net 3.5,Deferred Execution,我正试图将下面的角色提取到一个IEnumerable 私有静态项目联系人BuildProjectContactFromXml(XElement xml) { ProjectContact ProjectContact=新的ProjectContact(); projectContact.ProjectId=SafeConvert.ToInt32(xml.Attribute(“项目编号”).Value); projectContact.Roles=xml.Elements() .First()

我正试图将下面的
角色
提取到一个
IEnumerable


私有静态项目联系人BuildProjectContactFromXml(XElement xml)
{
ProjectContact ProjectContact=新的ProjectContact();
projectContact.ProjectId=SafeConvert.ToInt32(xml.Attribute(“项目编号”).Value);
projectContact.Roles=xml.Elements()
.First()
.要素()
.选择(角色=>new KeyValuePair(
SafeConvert.ToInt32(角色属性(“角色ID”).Value),
role.Attribute(“role_DESC”).Value);
返回项目联系人;
}

我的问题是关于延迟执行这个Linq语句。据我所知,当我返回此ProjectContact时,Linq语句尚未执行。有没有一种方法可以强制执行此语句,使其在该方法中执行,而不是在有人试图访问角色时执行?我想我可以通过调用.Count()来强制执行该语句,但似乎应该有更好的方法。

projectContact.Roles
将成为一个
IEnumerable
这是您想要的,还是作为列表或字典?对于列表,只需在语句末尾加上.ToList()

对于字典来说,这有点棘手:

   projectContact.Roles = xml.Elements() 
                                .First() 
                                .Elements()
                                .ToDictionary(
                 role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value),
                 role=> role.Attribute("ROLE_DESC").Value)); 
更新:在您的评论中,您声明角色id
IEnumerable
。从技术上讲,它可以是一个字典或一个列表,尽管在前一种情况下,您确实不能通过该接口使用它的字典特性。就这点而言,在后一种情况下,您可以使用它的列表特性,但似乎您特别不想要这种功能


因此,添加
.ToList()。它将是一个幕后列表,但没有超乎寻常的长度,用户仍然只能将其作为IEnumerable使用。

projectContact.Roles
将成为一个
IEnumerable
这是您想要的,还是作为列表或字典?对于列表,只需在语句末尾加上
.ToList()

对于字典来说,这有点棘手:

   projectContact.Roles = xml.Elements() 
                                .First() 
                                .Elements()
                                .ToDictionary(
                 role=> SafeConvert.ToInt32(role.Attribute("ROLE_ID").Value),
                 role=> role.Attribute("ROLE_DESC").Value)); 
更新:在您的评论中,您声明角色id
IEnumerable
。从技术上讲,它可以是一个字典或一个列表,尽管在前一种情况下,您确实不能通过该接口使用它的字典特性。就这点而言,在后一种情况下,您可以使用它的列表特性,但似乎您特别不想要这种功能


因此,添加
.ToList()。它将是一个幕后列表,但没有超常的长度,用户仍然只能将其作为IEnumerable使用。

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


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

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


无论哪种方式,您都可以执行
ToList()
.ToArray()
,您将得到查询的执行。

抱歉,问题尚未完成,已发布!我将在一分钟内写完我的问题:)角色是一个IEnumerable,对此很抱歉。在.NET4中,它们现在有元组,因此我们不必再为这些事情列出keyvaluepairs。新元组(int-value1,string-value2)@Jimmy-Hoffa,酷,不知道这个,但我目前在一个3.5项目中工作。谢谢@Jimmy Hoffa:我相信语法实际上是
Tuple.Create(int value1,string value2)
(从未指定的参数推断的类型)抱歉,问题还没有解决,它已经发布了!我将在一分钟内写完我的问题:)角色是一个IEnumerable,对此很抱歉。在.NET4中,它们现在有元组,因此我们不必再为这些事情列出keyvaluepairs。新元组(int-value1,string-value2)@Jimmy-Hoffa,酷,不知道这个,但我目前在一个3.5项目中工作。谢谢@Jimmy Hoffa:我相信语法实际上是
Tuple.Create(int value1,string value2)
(从未指定的参数推断的类型)在ProjectContact上,我确实希望角色是IEnumerable。原因是我不希望对象的用户能够编辑角色集合。如果我把它做成一个列表或一本字典,他们就可以向其中添加()。这有意义吗?啊,是的!这是有道理的!谢谢你的解释!在ProjectContact上,我确实希望角色是IEnumerable。原因是我不希望对象的用户能够编辑角色集合。如果我把它做成一个列表或一本字典,他们就可以向其中添加()。这有意义吗?啊,是的!这是有道理的!谢谢你的解释!