如何使用LINQ基于包含列表生成符合规则的排除列表?
用LINQ实现基于包含列表的排除列表生成
先把咱们的需求再掰扯清楚,避免理解偏差:
- 手里有个包含列表(
includeList),每条是Name+Type的配对 - 要针对指定的TypeId生成排除列表
- 核心规则:如果某个
Name完全没出现在包含列表里,那这个Name不会被任何类型排除;只有那些在包含列表里,但没和目标TypeId配对的Name,才需要被排除
第一步:补全必要的实体类
先把你示例里的类补全(默认MyItem也有Name属性,不然没法关联筛选):
public class NameTypeFilter { public string Name { get; set; } public string Type { get; set; } } public class MyItem { public string Name { get; set; } public string Type { get; set; } }
第二步:生成排除的Name列表
用LINQ可以分步写方便理解,也能合并成一行,先分步来:
// 示例:指定要处理的目标TypeId string targetTypeId = "T2"; // 1. 先拿到包含列表里所有出现过的唯一Name(只有这些Name才有可能被排除) var allIncludedNames = includeList.Select(filter => filter.Name).Distinct(); // 2. 拿到包含列表里和目标TypeId关联的所有唯一Name var namesLinkedToTargetType = includeList .Where(filter => filter.Type == targetTypeId) .Select(filter => filter.Name) .Distinct(); // 3. 排除列表 = 所有在包含列表里,但没和目标TypeId关联的Name var excludeNameList = allIncludedNames.Except(namesLinkedToTargetType);
想更简洁的话,直接合并成一行LINQ:
var excludeNameList = includeList.Select(f => f.Name).Distinct() .Except(includeList.Where(f => f.Type == targetTypeId).Select(f => f.Name).Distinct());
第三步:用排除列表筛选MyItem集合
如果最终目的是从MyItem列表里过滤掉符合排除条件的项,这么写就行:
// 准备示例数据 List<MyItem> myItems = new List<MyItem> { new MyItem { Name = "N1", Type = "T1" }, new MyItem { Name = "N1", Type = "T2" }, new MyItem { Name = "N2", Type = "T2" }, // N2不在包含列表里,不会被排除 new MyItem { Name = "N3", Type = "T1" } // N3不在包含列表里,不会被排除 }; // 筛选逻辑:保留「Name不在包含列表里」或者「Name和目标TypeId有关联」的项 var filteredItems = myItems.Where(item => !allIncludedNames.Contains(item.Name) || namesLinkedToTargetType.Contains(item.Name));
验证示例场景
拿你给出的包含列表测试:
List<NameTypeFilter> includeList = new List<NameTypeFilter>(); includeList.Add(new NameTypeFilter { Name = "N1", Type = "T1" });
- 如果指定
targetTypeId = "T1":namesLinkedToTargetType包含"N1",排除列表为空,没有需要排除的Name - 如果指定
targetTypeId = "T2":namesLinkedToTargetType是空的,排除列表就是["N1"],这时候筛选MyItem时,所有Name为"N1"的项会被排除,但N2、N3这类不在包含列表里的项会被保留
内容的提问来源于stack exchange,提问作者j doe
相关产品推荐
相关产品推荐

