如果值匹配多个键,则从字典中删除所有键

时间:2018-07-17 06:19:16

标签: c#

我有字典

private readonly Dictionary<string, WebResponse> _myDictionary;

让我们假设我当前在词典中有10个值。我可以在其中添加一些值,也可以根据类似于以下内容的字典中的键删除这些值。

删除:

_myDictionary.Remove(Key); 

其中key是一个字符串变量。

如果值匹配多个键,则可以一次删除多个键。我有{KAAR1,KAAR2,KAAR3,ABCDEF}之类的键。现在,我需要删除所有包含“ KAAR”的键。那有可能吗?

请帮助。

3 个答案:

答案 0 :(得分:8)

尝试一下:

_myDictionary
    .Where(x => x.Key.Contains("KAAR"))
    .ToList()
    .ForEach(kvp => _myDictionary.Remove(kvp.Key));

答案 1 :(得分:0)

下面是用户@Enigmavitivity给出的答案! 作为单独答案添加,以标记为正确答案。

_myDictionary.Where(x => x.Key.Contains("KAAR")).ToList().ForEach(kvp => _myDictionary.Remove(kvp.Key));

答案 2 :(得分:0)

我扩展了@Enigmativity的答案,提供了两个通用版本作为扩展方法。

/// <summary> Removes all duplicate values after the first occurrence. </summary>
public static void RemoveDuplicates<T, V> (this Dictionary<T, V> dict)
{
    List<V> L = new List<V> ();
    int i = 0;
    while (i < dict.Count)
    {
        KeyValuePair<T, V> p = dict.ElementAt (i);
        if (!L.Contains (p.Value))
        {
            L.Add (p.Value);
            i++;
        }
        else
        {
            dict.Remove (p.Key);
        }
    }
}

带有值字典(忽略键):0、1、2、3、5、1、2、4、5。 结果:0、1、2、3、5、4。

/// <summary> Removes all values which have any duplicates. </summary>
public static void RemoveAllDuplicates<T, V> (this Dictionary<T, V> dict)
{
    List<V> L = new List<V> ();
    int i = 0;
    while (i < dict.Count)
    {
        KeyValuePair<T, V> p = dict.ElementAt (i);
        if (!L.Contains (p.Value))
        {
            L.Add (p.Value);
            i++;
        }
        else
        {
            dict.Where (j => Equals (j.Value, p.Value)).ToList ().ForEach (j => dict.Remove (j.Key));
        }
    }
}

带有值字典(忽略键):0、1、2、3、5、1、2、4、5。 结果:3、4。

这些方法经过优化,可以防止.Where操作的多次执行(否则,每个重复项将执行n次,第一个之后的所有内容都已过时)。代码已经过测试并且可以正常工作。