删除字典中的键

时间:2013-02-13 07:51:21

标签: c# idictionary

如何根据以下条件删除字典中的指定键?

foreach (var kvp in dict)
            {
                if (kvp.Key.Contains('/'))
                {
                    //delete the key
                }
            }

6 个答案:

答案 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方法。