如何在没有ToArray()的单个项目上执行Linq匹配

时间:2017-03-11 13:26:15

标签: c# xml linq

这是我的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)。如何在没有循环但仍知道哪个项目匹配的情况下执行此操作?

1 个答案:

答案 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,则在没有元素匹配时抛出异常。

还有SingleOrDefaultSingle可确保只有一个匹配(如果匹配)。因此,如果有两个或更多匹配,则抛出异常。

您的代码不起作用,但这是一种根据您提供的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的调用。