如何移除C# Dictionary中值列表不含Name='1'的键
解决方案:过滤Dictionary中不符合条件的键值对
首先明确需求:咱们要保留那些值列表里至少包含一个Name为"1"的Field对象的键值对,移除掉不满足这个条件的(比如例子里的"paperino")。下面给你两种实用的实现方式:
方式一:用LINQ生成新字典(推荐,代码更简洁)
这种方式直接通过LINQ过滤出符合条件的键值对,生成一个新的Dictionary,不会修改原字典:
// 先定义你的Field类和原始字典 public class Field { public int Id { get; set; } public string Name { get; set; } } Dictionary<string, List<Field>> fields = new Dictionary<string, List<Field>>(); fields.Add("pippo", new List<Field>() { new Field() { Name = "1" }, new Field() { Name = "2" }, new Field() { Name = "3" } }); fields.Add("pluto", new List<Field>() { new Field() { Name = "1" } }); fields.Add("paperino", new List<Field>() { new Field() { Name = "3" } }); // 执行过滤 var filteredFields = fields .Where(kv => kv.Value.Any(f => f.Name == "1")) .ToDictionary(kv => kv.Key, kv => kv.Value);
代码解释:
Where(kv => kv.Value.Any(f => f.Name == "1")):筛选出所有值列表中存在Name为"1"的Field的键值对ToDictionary(...):把筛选后的结果转换成新的Dictionary
方式二:修改原字典(删除不符合条件的键)
如果你想直接修改原字典而不是生成新的,需要注意不能在遍历原字典的同时删除键,否则会抛出异常。所以我们先收集所有需要删除的键,再逐个删除:
// 收集所有要删除的键:值列表里没有Name为"1"的Field的键 var keysToRemove = fields.Keys .Where(k => !fields[k].Any(f => f.Name == "1")) .ToList(); // 逐个删除这些键 foreach (var key in keysToRemove) { fields.Remove(key); }
这两种方式处理后,你的字典都会只剩下"pippo"和"pluto"两个键,和你预期的结果完全一致。
内容的提问来源于stack exchange,提问作者Yakumo
相关产品推荐
相关产品推荐

