LINQ中.Contains()条件未按预期生效的问题解决求助
解决LINQ字符串部分匹配无结果的问题
问题根源
你之前的LINQ查询逻辑方向搞反了:你用fdp.Type.Contains(搜索值),但实际场景是搜索值(或其片段)包含Type字段的内容(比如搜索值里的MLE12WBC7W1包含E12WBC7W1),所以无论去空格还是忽略大小写,都无法匹配到目标数据。
解决方案
以下几种实现方式可以满足需求:
1. 移除空格后检查包含关系
先将搜索值的空格全部移除,再判断处理后的搜索值是否包含Type字段内容(同时忽略大小写避免大小写差异问题):
// 预处理搜索值:移除空格并转小写 var processedSearches = searchValues.Select(s => s.Replace(" ", "").ToLower()).ToList(); // 过滤匹配项 var matchedItems = fdpList.Where(fdp => processedSearches.Any(s => s.Contains(fdp.Type.ToLower())) ).ToList();
2. 拆分搜索值片段后匹配
如果搜索值的空格是分隔不同关键词的标志,可以拆分后逐个片段检查是否包含Type:
var matchedItems = fdpList.Where(fdp => searchValues.Any(sv => sv.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries) .Any(part => part.Contains(fdp.Type)) ) ).ToList();
这种方式不需要移除所有空格,适合搜索值是多关键词组合的场景。
3. 正则表达式精准匹配
如果需要更灵活的匹配(比如支持忽略大小写、特殊字符转义),可以用正则表达式:
using System.Text.RegularExpressions; var matchedItems = fdpList.Where(fdp => searchValues.Any(sv => Regex.IsMatch(sv, Regex.Escape(fdp.Type), RegexOptions.IgnoreCase) ) ).ToList();
Regex.Escape会自动转义Type中的特殊字符(如., *),避免正则语法冲突。
验证逻辑
拿你的测试数据举例:
- 搜索值处理后为
mle12wbc7w1ar(或拆分为["MLE12WBC7W1", "A", "R"]) - Type字段
E12WBC7W1转小写后是e12wbc7w1,会被mle12wbc7w1ar包含,因此能成功匹配。
内容的提问来源于stack exchange,提问作者whatISboolean
相关产品推荐
相关产品推荐

