LINQ多条件Where子句不生效:CSV数据过滤结果为空问题
问题分析与解决方案
你的代码逻辑踩了一个典型的逻辑误区:你是在对单个单元格同时施加两个互斥(或极少重合)的条件,要求这个单元格的文本既要等于domain.Name,又要包含domaintype.ToString()的内容——这显然和你实际需求不符,你要的是整行数据满足两个独立条件:
- 该行中存在至少一个单元格的文本等于
domain.Name - 该行中存在至少一个单元格的文本包含
domaintype.ToString()的内容(可以是同一个单元格,也可以是不同单元格)
修正后的代码
var rows = excelsheet // 先把所有单元格按所在行分组,同一行的单元格归为一组 .GroupBy(x => x.Start.Row) // 对每一行(分组)判断两个条件是否同时满足 .Where(rowGroup => rowGroup.Any(cell => cell.Text == domain.Name) && rowGroup.Any(cell => cell.Text.Contains(domaintype.ToString())) ) // 提取符合条件的行号 .Select(rowGroup => rowGroup.Key) .ToList();
为什么原来的代码不生效?
原来的Where(x => x.Text == domain.Name && x.Text.Contains(domaintype.ToString()))是逐个检查单元格:只有当某个单元格的文本同时满足等于域名和包含类型字符串时,才会被选中。除非你的domain.Name本身就包含domaintype.ToString()的内容,否则根本找不到这样的单元格,自然返回空列表。
而修正后的代码先按行分组,把判断逻辑从“单个单元格”升级到“整行”,分别检查行内是否存在符合两个条件的单元格,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Karu
相关产品推荐
相关产品推荐

