Удалить элемент в словаре на основе значения - PullRequest
51 голосов
/ 28 октября 2009

У меня есть Dictionary<string, string>.

Мне нужно заглянуть в этот словарь, чтобы узнать, существует ли значение, основанное на вводе из другого места, и если оно существует, удалите его.

ContainsValue просто говорит true / false, а не индекс или ключ этого элемента.

Помощь!

Спасибо

РЕДАКТИРОВАТЬ: Только что нашел это - что вы думаете?

var key = (from k in dic where string.Compare(k.Value, "two", true) ==
0 select k.Key).FirstOrDefault();

РЕДАКТИРОВАТЬ 2: Я также только что поднял это, что может работать

foreach (KeyValuePair<string, string> kvp in myDic)
{
    if (myList.Any(x => x.Id == kvp.Value))
        myDic.Remove(kvp.Key);
}

Ответы [ 6 ]

114 голосов
/ 28 октября 2009

Вы пытаетесь удалить одно значение или все совпадающие значения?

Если вы пытаетесь удалить одно значение, как вы определяете значение, которое хотите удалить?

Причина, по которой вы не получаете ключ назад при запросе значений, заключается в том, что словарь может содержать несколько ключей в паре с указанным значением.

Если вы хотите удалить все совпадающие экземпляры одного и того же значения, вы можете сделать это:

foreach(var item in dic.Where(kvp => kvp.Value == value).ToList())
{
    dic.Remove(item.Key);
}

И если вы хотите удалить первый соответствующий экземпляр, вы можете запросить, чтобы найти первый элемент, и просто удалите это:

var item = dic.First(kvp => kvp.Value == value);

dic.Remove(item.Key);

Примечание: Вызов ToList() необходим для копирования значений в новую коллекцию. Если вызов не выполнен, цикл будет модифицировать коллекцию, по которой он повторяется, вызывая исключение при следующей попытке повторения после удаления первого значения.

7 голосов
/ 28 октября 2009
Dictionary<string, string> source
//
//functional programming - do not modify state - only create new state
Dictionary<string, string> result = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) != 0)
  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
//
// or you could modify state
List<string> keys = source
  .Where(kvp => string.Compare(kvp.Value, "two", true) == 0)
  .Select(kvp => kvp.Key)
  .ToList();

foreach(string theKey in keys)
{
  source.Remove(theKey);
}
2 голосов
/ 28 октября 2009

Прокрутите словарь, чтобы найти индекс, а затем удалите его.

1 голос
/ 04 января 2017

Вот метод, который вы можете использовать:

    public static void RemoveAllByValue<K, V>(this Dictionary<K, V> dictionary, V value)
    {
        foreach (var key in dictionary.Where(
                kvp => EqualityComparer<V>.Default.Equals(kvp.Value, value)).
                Select(x => x.Key).ToArray())
            dictionary.Remove(key);
    }
0 голосов
/ 01 марта 2018

Вы можете использовать следующее как метод расширения

 public static void RemoveByValue<T,T1>(this Dictionary<T,T1> src , T1 Value)
    {
        foreach (var item in src.Where(kvp => kvp.Value.Equals( Value)).ToList())
        {
            src.Remove(item.Key);
        }
    }
0 голосов
/ 22 июля 2016

В моем случае я использую это

  var key=dict.FirstOrDefault(m => m.Value == s).Key;
            dict.Remove(key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...