我有一个像
这样的XML文件<root>
<Child val1="1" val2="2"/>
<Child val1="3" val2="4"/>
<Child val1="5" val2="6"/>
<Child val1="7" val2="8"/>
<Child val1="9" val2="10"/>
<Child val1="11" val2="12"/>
<Child val1="13" val2="14"/>
</root>
我需要将val1
和val2
的属性值读取为List<String>
结果列表将包含
{ "1" , "2" , "3" , ........ ,"13" , "14" }
以下是我的示例代码:
XDocument XD = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> l_lstTemp = XD.Descendants("Child")
.Select(X => new List<String> { X.Attribute("val1").Value,
X.Attribute("val2").Value })
.SelectMany(X => X)
.Distinct()
.ToList();
有没有办法使用Select
代替selectMany
?
如何修改现有的expression
?
答案 0 :(得分:3)
SelectMany
正在做你想要的 - 它将结果从一系列字符串列表变为单个字符串序列。你为什么要使用能够准确表达你需要的工作代码并改变它?
不可否认,你可以通过稍微不同地使用SelectMany
来简化它,并使用数组而不是列表来缩短内容::
XDocument doc = XDocument.Load(Application.StartupPath + "\\foo.xml");
List<String> values = doc.Descendants("Child")
.SelectMany(x => new[] { x.Attribute("val1").Value,
x.Attribute("val2").Value })
.Distinct()
.ToList();
答案 1 :(得分:0)
你的问题场景正是SelectMany所针对的,所以我认为我们可能试图消除它的任何事情都会使事情复杂化。 :)
最初的.Select返回IEnumerable的结果,而没有我们得到的.SelectMany:
{
IEnumerable<string> [ "1", "2" ]
IEnumerable<string> [ "3", "4" ]
etc...
}
.SelectMany采用IEnumerable将'初始化'初始结果转换为另一个IEnumerable,让你得到你想要的东西:
{
IEnumerable<string> [ "1", "2", "3", "4" ]
}
这是一篇篇幅更好的帖子A Visual Look at the LINQ SelectMany Operator。