Как удалить записи из словаря, используя значение - PullRequest
4 голосов
/ 07 июня 2010

У меня есть словарь в коллекции bleow:

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

Из приведенного выше словаря я хочу удалить все записи, где значение == "val1", чтобы в результате была только следующая запись:

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

Мой исходный код VB на VS2008 и предназначен для 3,5

Ответы [ 5 ]

14 голосов
/ 07 июня 2010

Сначала необходимо найти все ключи, для которых ассоциированное значение равно val1:

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

Затем вы можете удалить каждый из этих ключей:

foreach (var key in keysToRemove)
{
    mydic.Remove(key);
}
12 голосов
/ 07 июня 2010

Ответ не 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);

То же предостережение, что и с другими ответами: если ваше значение определяет равенство по ссылке, вам нужно будет выполнить дополнительную работу Это просто база.

3 голосов
/ 07 июня 2010

Вы также можете использовать

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

x не будет иметь ни одного из значений val1

1 голос
/ 19 марта 2014
foreach(var key in dict.AllKeys.ToArray())
{
    if(...)
        //remove key or something
}
0 голосов
/ 22 февраля 2016

Ответ старый, но я делаю то же самое без создания другого словаря.

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

  if (x.Value == "val1")) 
  {  MyDic.Remove(x.Key); } 
}
...