C# Linq实现数据过滤:排除状态为0及对应Val值所有关联行
实现思路
- 首先提取所有
Status为0的Val值,构建去重的黑名单集合 - 过滤原数据集,仅保留
Val不在黑名单中的条目即可:只要Val不在黑名单中,就代表该Val对应的所有条目Status都为1,天然满足第一条剔除Status为0行的规则
代码实现
首先定义对应数据结构:
public class DataItem { public int Val { get; set; } public int Param { get; set; } public int Status { get; set; } }
过滤逻辑代码:
// 模拟原始数据集 List<DataItem> originalData = new List<DataItem> { new DataItem{ Val = 1, Param = 100, Status = 1 }, new DataItem{ Val = 2, Param = 100, Status = 1 }, new DataItem{ Val = 3, Param = 100, Status = 1 }, new DataItem{ Val = 4, Param = 100, Status = 1 }, new DataItem{ Val = 5, Param = 100, Status = 1 }, new DataItem{ Val = 3, Param = 200, Status = 0 }, new DataItem{ Val = 5, Param = 200, Status = 0 }, }; // 构建Val黑名单:所有出现过Status=0的Val值,用HashSet提升查找效率 var forbiddenVals = originalData .Where(item => item.Status == 0) .Select(item => item.Val) .ToHashSet(); // 执行过滤得到结果 var filteredData = originalData .Where(item => !forbiddenVals.Contains(item.Val)) .ToList();
如果偏好查询表达式写法也可以用以下形式:
var filteredData = from item in originalData where !forbiddenVals.Contains(item.Val) select item;
结果验证
最终得到的filteredData内容完全匹配需求:
| Val | Param | Status |
|---|---|---|
| 1 | 100 | 1 |
| 2 | 100 | 1 |
| 4 | 100 | 1 |
内容的提问来源于stack exchange,提问作者OneoFtheBest
相关产品推荐
相关产品推荐

