C# LINQ用于列表中具有某些值的字符串STARTS<;字符串>;
我正在使用LINQ解析XDocument。我想检查带有键“BusinessStructure”的一个元素是否以我的C# LINQ用于列表中具有某些值的字符串STARTS<;字符串>;,c#,xml,linq,C#,Xml,Linq,我正在使用LINQ解析XDocument。我想检查带有键“BusinessStructure”的一个元素是否以我的列表过滤器中的一个字符串开头。换句话说,假设我有: x.Element(“业务结构”).Value=“testing123” 及 var filters=新列表{“test”,“hello”} 使用LINQ,我该如何做像 ... where x.Element("BusinessStructure").Value.StartsWith(filters[0]) select new..
列表过滤器中的一个字符串开头。换句话说,假设我有:
x.Element(“业务结构”).Value=“testing123”
及
var filters=新列表{“test”,“hello”}
使用LINQ,我该如何做像
...
where x.Element("BusinessStructure").Value.StartsWith(filters[0])
select new...
但是,我不想获取过滤器列表的第一个索引,而是想“循环”列表中的所有值,并检查XElement值是否以它开头。这是否可以使用LINQ实现,还是必须使用foreach
实现?您可以直接使用LINQ解决方案,稍微修改查询:
let bs = x.Element("BusinessStructure")
where bs != null && filters.Any(f => bs.Value.StartsWith(f))
或者,您可以使用过滤器构建正则表达式:
var prefixRegex = new Regex("\\A" + string.Join("|",filters.Select(f=>Regex.Escape(f)));
...
let bs = x.Element("BusinessStructure")
where bs != null && prefixRegex.IsMatch(bs.Value)
如果绩效是一个考虑因素,那么尝试并衡量两者。我会这样做
filters.Any(f => x.Element("BusinessStructure").Value.IndexOf(f)==0)
请注意,如果该元素不存在,您将得到一个NRE。最好显式转换为字符串并检查-where filters.Any(f=>((string)x.Element(“BusinessStructure”)).StartsWith(f))代码>@Tim谢谢你提醒我NRE的可能性。我宁愿使用显式的空检查来处理这个问题,以使意图更加清晰。编辑。这甚至不会编译。如果更正了,它与当前接受的答案基本相同(没有错误检查)。你在说什么?我正在使用这段代码,它编译得很好。只需要把它放在循环中。我只是把代码放在这里,用来完成检查任务。你有一个观点,那就是它有点像公认的答案,但它不一样。您应该在这里找到更好的方法CS0119'XContainer.Element(XName)'是一种方法,在给定上下文中无效
。我正在做我应该做的事情。社区的工作是提高所有问题和答案的质量。天哪,这太有趣了。我编辑了代码,这样就可以编译了。开心点!