从给定要删除的键列表中,从字典中删除键值对

5

我有一个List<string> AllowedList和一个Dictionary<string,List<string>> MyDictionary

对于字典中的每个键,我想检查它是否在AllowedList上,如果不是,则删除字典中的键和值。

我直觉地尝试了这个方法,似乎是我想要的:

foreach (string key in MyDictionary.Keys)
{
    if (!AllowedList.Contains(key)) MyDictionary.Remove(key);
}

然而,我遇到了一个InvalidOperationException

集合已被修改;枚举操作可能无法执行。

我相信可能有简单的方法可以解决这个问题,但我并没有立刻看出来。

2个回答

10
您可以使用 Enumerable.Except 查找不在字典中的键:
foreach (var key in MyDictionary.Keys.Except(AllowedList).ToList())
    MyDictionary.Remove(key);
ToList() 方法创建一个新的列表,用于存储集合的差集,并且可以避免异常。

1
+1 我认为第一行可以简化为 var keys = MyDictionary.Keys; - farfareast
2
Seismoid的解决方案也是有效的。虽然我最喜欢这个linq集合差异建议。 - user17753

2

您可以/应该将要删除的键存储在临时列表中,在此之后使用额外的for循环进行所有删除操作。

List<TKey> templist = new List<TKey>();

foreach (var x in MyDictionary)
{
    if (!AllowedList.Contains(x.Key))
        templist .Add(x.Key);
}
foreach (TKey item in templist )
{
    MyDictionary.Remove(item);
}

这也可能很有帮助: 如何使用值从字典中删除条目


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接