C#实现Dictionary<string, List<string>>字典的比较验证
C# 字典子集(包含关系)判断实现
基础定义
待比较的两个字典声明如下:
Dictionary<string, List<string>> Test1 = new Dictionary<string, List<string>>(); Dictionary<string, List<string>> Test2 = new Dictionary<string, List<string>>();
判定规则
源字典包含于目标字典,需要同时满足两个条件:
- 源字典的所有键,在目标字典中都存在
- 源字典每个键对应的
List<string>值,与目标字典同键对应的值完全一致(元素个数、顺序、内容完全匹配)
不满足任意一条,即判定为不存在包含关系。
验证示例
- 反例:Test1包含键A、B、C,A对应值
[Apple, Banana],B对应[Grape, Pears],C对应[Orange, cherry];Test2中A对应值为[Apple, Banana, Watermelon],其余键值和Test1一致,最终判定Test1不包含于Test2。 - 正例:Test3所有键值和上述Test1完全一致;Test4除了包含Test3全部键值对外,额外新增键D,对应值
[Mango, Pineapple, plum],最终判定Test3包含于Test4。
可复用实现代码
直接写扩展方法即可全局调用:
public static class DictionaryExtensions { /// <summary> /// 判断当前字符串-字符串列表字典是否为目标字典的子集(即被目标字典包含) /// </summary> /// <param name="source">源字典</param> /// <param name="target">目标字典</param> /// <param name="stringComparison">字符串比较规则,默认严格大小写匹配</param> /// <returns>源字典包含于目标字典返回true,否则返回false</returns> public static bool IsSubsetOf( this Dictionary<string, List<string>> source, Dictionary<string, List<string>> target, StringComparison stringComparison = StringComparison.Ordinal) { if (source == null) throw new ArgumentNullException(nameof(source)); if (target == null) throw new ArgumentNullException(nameof(target)); foreach (var (key, sourceList) in source) { // 目标字典不存在当前键,直接判定不满足 if (!target.TryGetValue(key, out var targetList)) { return false; } // 列表长度不同,必然不一致 if (sourceList.Count != targetList.Count) { return false; } // 逐元素比较 for (int i = 0; i < sourceList.Count; i++) { if (!string.Equals(sourceList[i], targetList[i], stringComparison)) { return false; } } } return true; } }
调用方式
// 默认规则:严格匹配大小写、严格匹配列表顺序 bool result = Test1.IsSubsetOf(Test2); // 忽略字符串大小写的比较场景 bool ignoreCaseResult = Test1.IsSubsetOf(Test2, StringComparison.OrdinalIgnoreCase);
补充说明:如果业务上不需要严格匹配列表内元素的顺序,可以在比较前先对
sourceList和targetList按相同规则排序,再做逐元素比较即可。
内容的提问来源于stack exchange,提问作者Gopal Krishnan
相关产品推荐
相关产品推荐

