Подтвердить что ты не робот

Удалить элемент в словаре на основе значения

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

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

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

Help!

Спасибо

EDIT: Просто нашел это - что вы думаете?

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

EDIT 2: Я также просто сбил это, что могло бы работать

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

Ответ 1

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

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

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

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

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() необходим для копирования значений в новую коллекцию. Если вызов не выполнен, цикл будет изменять коллекцию, в которой он итерируется, в результате чего исключение будет отправлено при следующей попытке итерации после удаления первого значения.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

  var key=dict.FirstOrDefault(m => m.Value == s).Key;
            dict.Remove(key);