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

时间:2010-06-07 18:14:24

标签: c# .net dictionary collections

我有一个词典集合如下:

mydic.addvalue(key1, val1)
mydic.addvalue(key2, val1)
mydic.addvalue(key3, val1)
mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)

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

mydic.addvalue(key4, val2)
mydic.addvalue(key5, val2)

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

5 个答案:

答案 0 :(得分:14)

首先需要查找关联值为val1的所有密钥:

var keysToRemove = mydic.Where(kvp => kvp.Value == val1)
                        .Select(kvp => kvp.Key)
                        .ToArray();

然后你可以删除每个键:

foreach (var key in keysToRemove)
{
    mydic.Remove(key);
}

答案 1 :(得分:12)

基于用户评论的非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);
    }
}

使用示例:

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);

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

答案 2 :(得分:3)

您也可以使用

var x= (from k in mydic
           where k.Value != val1
           select k).ToDictionary(k=>k.key);

x将不具有任何val1的

答案 3 :(得分:1)

foreach(var key in dict.AllKeys.ToArray())
{
    if(...)
        //remove key or something
}

答案 4 :(得分:0)

它的答案很古老,但这就是我在不创建另一个词典的情况下做同样的事情。

foreach (KeyValuePair<TKey, TValue> x in MyDic) {

  if (x.Value == "val1")) 
  {  MyDic.Remove(x.Key); } 
}
相关问题