如何修改LINQ查询,筛选出含所有目标词片段的ObjectA对象?
解决子字符串匹配的筛选问题
嘿,这个需求很好实现,你只需要调整一下LINQ表达式里的判断逻辑就行~
原来的代码wordsToFind.All(objectA.StringList.Contains)是在检查目标词是否完整出现在StringList中,而我们需要的是目标词是StringList中某元素的子字符串,所以要把Contains的逻辑换成「检查StringList里有没有任意一个字符串包含当前目标词」。
修改后的代码如下:
List<ObjectA> myObjectList; List<string> wordsToFind; var result = myObjectList.Where(objectA => wordsToFind.All(targetWord => objectA.StringList.Any(str => str.Contains(targetWord)) ) );
逻辑解释:
wordsToFind.All(...):保证所有目标词都要满足后续的匹配条件objectA.StringList.Any(str => str.Contains(targetWord)):检查当前ObjectA的StringList中,是否存在至少一个字符串str,包含当前目标词targetWord作为子串
用你给的例子验证:当wordsToFind = {"tes","don"},某ObjectA的StringList = {"test", "done"}时:
- 对于"tes",
"test".Contains("tes")返回true,所以Any返回true - 对于"don",
"done".Contains("don")返回true,所以Any返回true - 所有目标词都满足匹配要求,
All返回true,这个ObjectA会被纳入结果集,完全符合你的需求
额外优化(可选):
如果需要忽略大小写匹配(比如"Tes"也能匹配"test"),可以把str.Contains(targetWord)换成:
str.IndexOf(targetWord, StringComparison.OrdinalIgnoreCase) >= 0
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

