如何根据以下条件删除字典中的指定键?
foreach (var kvp in dict)
{
if (kvp.Key.Contains('/'))
{
//delete the key
}
}
答案 0 :(得分:9)
你会这样做:
foreach(var keyToDelete in dict.Keys.Where(x => x.Contains('/')).ToList())
dict.Remove(keyToDelete);
这里重要的是在ToList()
之后调用Where
。这会将所有应删除的键放入一个可以迭代的新列表中
如果您在没有ToList()
的情况下尝试此代码,则会获得InvalidOperationException
:
收藏被修改;枚举操作可能无法执行。
请注意,此代码比目前接受的答案更有效。它只复制需要删除的密钥而不是完整的字典。
答案 1 :(得分:3)
问题在于,在循环其元素时无法修改集合。解决方案是将键移除到不同的集合中,然后循环以删除元素。这就是丹尼尔的回答。
如果你不能/不想使用LINQ,你可以这样做:
List<YourKeyType> toRemove = new List<YourKeyType>();
foreach (var kvp in dict)
{
if (kvp.Key.Contains('/'))
toRemove.Add(kvp.Key);
}
foreach (var aKey in toRemove)
dict.Remove(aKey);
答案 2 :(得分:2)
根据您的数据集,在没有您要丢弃的密钥的情况下创建新对象可能更有效:
dict = dict.Where(kvp => !kvp.Key.Contains('/'))
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
我还可以说这是删除密钥的首选,因为它更清楚地传达了代码的意图,但这与我的个人编码风格密切相关,因此您的里程可能会有所不同。
答案 3 :(得分:2)
我意识到这已被标记为已回答,但我认为如果您只想从未指定最大大小的字典中删除单个密钥,那么只需删除一个密钥即可复制整个ENTIRE字典。一个很好的解决方案!
要仅删除匹配键的一个条目,您可以执行以下操作:
foreach (var kvp in dict)
{
if (kvp.Key.Contains('/'))
{
dict.Remove(kvp.Key);
break;
}
}
不需要整个词典的副本!
请注意,这假设只有一个要删除的密钥。如果可能还有更多,请使用Daniel's或Francesco的答案。
(实际上,我建议您只使用Daniel的答案,但我会在此处将其作为示例而不使用Linq。)
答案 4 :(得分:1)
编辑:正如下面的其他答案所说,下面代码中重要的是调用ToList()。这将创建一个dict副本,您可以在从dict中删除项目时进行迭代,而无需更改正在迭代的集合。
你可以通过使用
之类的东西来做到这一点 dict.ToList().ForEach(a => { if (a.Key.Contains('/') dict.Remove(a.Key); });
答案 5 :(得分:-2)
Foreach可能会抛出异常。请尝试使用。
要删除,请使用Remove方法。