gpt4 book ai didi

c# - 包含 Linq to XML Where 子句中的功能

转载 作者:行者123 更新时间:2023-11-30 21:14:24 25 4
gpt4 key购买 nike

Linq to XML 中 where 子句的 .Contains() 函数出现意外行为。它似乎像字符串函数中的“==”而不是 Contains() 一样运行。

例子:

var q = from sr in SearchResults.Descendants("Result")
where _filters.Contains((string)sr.Element("itemtype"))
orderby (string)sr.Element("ipitemtype") ascending
select new SearchItem
{
//Create Object
ID = (string)sr.Element("blabla"),
}

_filters 是一个字符串列表。假设它包含 3 个值:

_filters[0] = "videos";
_filters[1] = "documents";
_filters[2] = "cat pictures";

现在发生的情况是,如果满足以下条件,查询将完美运行

<itemtype>videos</itemtype> 

是 XML 节点。

但是,如果节点是

<itemtype>videos mission critical document advertising</itemtype>, 

IEnumerable 返回空白,这对我来说意味着操作数的功能类似于“==”而不是“Contains()”。

知道我做错了什么吗?

dtb 的获奖答案:

替换

where _filters.Contains((string)sr.Element("itemtype"))

where _filters.Any(filter => ((string)sr.Element("itemtype")).Contains(filter))

最佳答案

试试这个:

_filters.Any(s => ((string)sr.Element("itemtype") ?? "").Contains(s))

这样您就可以检查元素的值是否包含 _filters 中的任何字符串。使用 null 合并运算符可确保当 itemtype 节点不存在时不会抛出 NullReferenceException,因为它已替换为空字符串。

另一种方法是使用 let 并过滤掉空值:

var q = from sr in SearchResults.Descendants("Result")
let itemtype = (string)sr.Element("itemtype")
where itemtype != null &&
_filters.Any(filter => itemtype.Contains(filter))
orderby (string)sr.Element("ipitemtype") ascending
select new SearchItem
{
//Create Object
ID = (string)sr.Element("blabla")
}

请注意,String.Contains 区分大小写。因此,对“视频”的检查不会匹配带有大写字母“V”的“视频”。要忽略大小写,您可以按以下方式使用 String.IndexOf:

_filters.Any(filter => itemtype.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) >= 0)

关于c# - 包含 Linq to XML Where 子句中的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6257599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com