如何为给定C#代码编写LINQ查询,实现按动态逗号分隔值筛选字符串列表
C# 嵌套遍历筛选逻辑转LINQ实现
实现逻辑对齐
你原代码的核心规则是:从给定字符串列表中,保留所有元素——只要该元素包含任意一个用户输入的、逗号分隔的搜索子串,内层循环找到第一个匹配项就停止判断,避免重复添加结果。
这套逻辑完全可以用LINQ等价替换,不需要手动写嵌套循环和break判断。
可直接使用的实现代码
// 初始化原始字符串列表 List<string> originalStrings = new List<string> { "abdecacd", "facdgh", "iabcacdjk", "lmn", "opqe", "acbd", "efgh" }; // 动态接收用户输入的逗号分隔搜索内容,替代原硬编码的strToSearch string userInput = Console.ReadLine()?.Trim() ?? string.Empty; // 拆分搜索关键词:自动过滤空值、去掉每个关键词的首尾空格,避免无效匹配 string[] searchTerms = userInput .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .ToArray(); // 核心LINQ查询 完全替代原双层for循环逻辑 var filterResult = originalStrings .Where(item => searchTerms.Any(term => item.Contains(term))) .ToList(); // 遍历输出匹配结果 foreach (var resultItem in filterResult) { Console.WriteLine(resultItem); }
对应原代码的优化点
- 删掉了冗余自封装的
Like方法:string.Contains本身就能完成子串包含判断,不需要额外写方法包装 searchTerms.Any(...)完全等价于原内层循环找到匹配项就break的行为,同一个列表项就算匹配多个关键词,也只会被加入结果一次- 适配动态输入:不管用户输入多少个、什么样的逗号分隔搜索值,拆分逻辑都能自动适配,不需要手动调整循环边界
- 移除了无意义的
strNew != null判断:LINQ查询就算没有匹配到任何元素,返回的也是空集合,永远不会为null,直接遍历输出即可 - 补充了鲁棒性处理:拆分时自动过滤空项、给关键词做去空格处理,解决用户输入连续逗号、关键词前后带多余空格导致的匹配偏差
- 执行效率和原手写循环无差异:LINQ的
Where+Any底层和你手写的嵌套循环、break逻辑执行流程完全一致,不会有额外性能损耗
内容的提问来源于stack exchange,提问作者aniket narvankar
相关产品推荐
相关产品推荐

