C#:如何检查List<Fields>对象值是否包含字符串数组任意词汇
实现包含目标词汇的短语匹配逻辑
问题背景
现有代码仅能匹配Value与urgentWords数组中词汇完全相等的情况,无法匹配Value是包含目标词汇的短语(如"Urgent ABC XYZ"、"review ASAP")的场景,需要调整匹配逻辑。
解决方案1:子串匹配(宽松匹配)
直接检查Value是否包含数组中的任意词汇(忽略大小写),修改后的代码如下:
var UrgentText = data.Fields .Where(x => x.Name.Equals("urgent", StringComparison.InvariantCultureIgnoreCase) && urgentWords.Any(word => x.Value.IndexOf(word, StringComparison.InvariantCultureIgnoreCase) >= 0)) .Count();
关键改动说明:
- 将
x.Name.ToLower() == "urgent"替换为x.Name.Equals("urgent", StringComparison.InvariantCultureIgnoreCase),无需额外做大小写转换,更高效且避免文化差异问题。 - 用
urgentWords.Any(...)替代原有的Contains逻辑:遍历紧急词汇数组,通过IndexOf检查Value是否包含当前词汇(忽略大小写),只要有一个匹配即符合条件。
解决方案2:完整单词匹配(严格匹配)
如果需要避免部分匹配(比如防止"Urgent"匹配"UrgentXYZ"或"XUrgent"),可以使用正则表达式匹配完整单词:
// 预先构建匹配完整单词的正则表达式集合 var urgentRegexes = urgentWords .Select(word => new Regex($@"\b{Regex.Escape(word)}\b", RegexOptions.IgnoreCase)) .ToList(); var UrgentText = data.Fields .Where(x => x.Name.Equals("urgent", StringComparison.InvariantCultureIgnoreCase) && urgentRegexes.Any(regex => regex.IsMatch(x.Value))) .Count();
关键改动说明:
\b表示单词边界,确保匹配的是独立的目标词汇;Regex.Escape用于转义词汇中的特殊字符,避免正则语法冲突。RegexOptions.IgnoreCase保证忽略大小写匹配,符合需求。
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

