关于c#:如果值与多个键匹配,则从字典中删除所有键


Delete all the keys from the dictionary if the value matches for more than one key

我有一本字典

1
private readonly Dictionary<string, WebResponse> _myDictionary;

假设当前字典中有10个值。我可以在其中添加一些值,也可以根据字典中的键删除这些值,如下所示。

删除:

1
_myDictionary.Remove(Key);

其中键是字符串变量。

如果值与多个键匹配,是否可以一次删除多个键。我有kaar1、kaar2、kaar3、abcdef等键。现在我需要删除所有包含"kaar"的密钥。有可能吗?

请帮忙。


试试这个:

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <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次执行,其中第一次执行之后的所有操作都将过时)。代码已经过测试和工作。


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

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