这是我的XML文件:
<items>
<item>Apples</item>
<item>Lemon</item>
<item>Grapefruit</item>
</items>
我试图找出此XML列表中的任何<item>
是否与下面列表中的最后一项匹配:
var titleList = new List<string> { "Pear", "Lime", "Lemon" };
此刻我这样做:
var itemMatch = Settings.xdoc.Root
.Descendants("Items")
.Where(test => titleList.Last().Contains((string)test.Element("Item")))
.ToArray();
foreach (var item in itemMatch)
{
Debug.WriteLine(item.Element("item"));
}
但是foreach循环似乎毫无意义,因为只有一场比赛(在这种情况下是Lemon)。如何在没有循环但仍知道哪个项目匹配的情况下执行此操作?
答案 0 :(得分:4)
简单地使用FirstOrDefault
(或First
),顺便说一句,&#34;合并&#34;进入Where
:
var itemMatch = Settings.xdoc.Root
.Descendants("Items")
.FirstOrDefault(test => titleList.Last().Contains((string)test.Element("Item")));
如果没有元素匹配,这将为您提供与谓词匹配的第一个元素或默认值(null
)。如果使用First
,则在没有元素匹配时抛出异常。
还有SingleOrDefault
和Single
可确保只有一个匹配(如果匹配)。因此,如果有两个或更多匹配,则抛出异常。
您的代码不起作用,但这是一种根据您提供的XML使其工作的方法:
var titleList = new List<string> { "Pear", "Lime", "Lemon" };
var lastItemInList = titleList.Last();
var itemMatch = Settings.xdoc.Root
.Elements("item")
.FirstOrDefault(item => (string) item == lastItemInList)
仔细阅读这部分问题后
我试图找出此XML列表中的任何一个是否与列表中的最后一项匹配
我的印象是您只想确定XML中是否存在<item>Lemon</item>
。在这种情况下,您可以将FirstOrDefault
替换为Any
。返回值为bool
,表示是否找到了元素。
此外,关于问题标题中的ToArray
:在使用ToArray
枚举结果之前,您不需要致电foreach
。当您调用ToArray
时,序列被枚举并存储在数组中,它是foreach
中枚举的数组。但是,如果您只想在不需要将其存储在数组中时枚举原始序列,那么您可以跳过对ToArray
的调用。