如何使用该值从字典中删除条目

use*_*233 4 .net c# collections dictionary

我有一个词典集合作为bleow:

mydic.addvalue(key1, val1)
mydic.addvalue(key2, val1)
mydic.addvalue(key3, val1)
mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)
Run Code Online (Sandbox Code Playgroud)

从上面的字典我想删除值=="val1"的所有条目,以便结果只有以下条目:

mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)
Run Code Online (Sandbox Code Playgroud)

我的VB源代码在VS2008上,目标是3.5

dtb*_*dtb 14

首先需要找到关联值为的所有键val1:

var keysToRemove = mydic.Where(kvp => kvp.Value == val1)
                        .Select(kvp => kvp.Key)
                        .ToArray();
Run Code Online (Sandbox Code Playgroud)

然后你可以删除每个键:

foreach (var key in keysToRemove)
{
    mydic.Remove(key);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个.但是(@user)请记住,如果TValue是一个引用类型,你需要为平等做额外的工作(除非你只是比较引用,否则).此外,`.ToArray()`或`.ToList()`是绝对必要的,以便在foreach中迭代结果*并*修改原始字典. (4认同)

Ant*_*ram 13

基于用户评论的非LINQ答案.

private static void RemoveByValue<TKey,TValue>(Dictionary<TKey, TValue> dictionary, TValue someValue)
{
    List<TKey> itemsToRemove = new List<TKey>();

    foreach (var pair in dictionary)
    {
        if (pair.Value.Equals(someValue))
            itemsToRemove.Add(pair.Key);
    }

    foreach (TKey item in itemsToRemove)
    {
        dictionary.Remove(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "foo");
dictionary.Add(2, "foo");
dictionary.Add(3, "bar");
string someValue = "foo";
RemoveByValue(dictionary, someValue);
Run Code Online (Sandbox Code Playgroud)

与其他答案一样的警告:如果您的值通过引用确定相等性,则您需要做额外的工作.这只是一个基础.