Удаление определенных записей (определенных в List) из Dictionary дает критическую ошибку ->

#c# #list #dictionary #generics #collections

#c# #Список #словарь #общие #Коллекции

Вопрос:

У меня есть список строк. Вот так,

     public List<string> filterWords = new List<string>()
    {
            "an" ,
            "be",
            " ",
            "in",
            "the",
            "of"
            ..
        ...
        .
        . 
        ....
    };
 

У меня есть коллекция словарей в формате Dictionary<string, int>, например,

     {{of, 2}},
    {{an, 4}},
    {{in, 7}},
    {{the, 8}},
    {{literate, 3}},
    {{culture, 5}},
    {{be, 5}},
    ...
    and so and so
 

Цель состоит в том, чтобы проверить / выяснить и удалить из приведенных выше словарных записей, которые содержат ключи из предыдущего списка. т.е. an , be и т. Д.

Базовый код, который я собрал до сих пор, это —

     public Dictionary<string, int> UniqueWordsDictionary(Dictionary<string, int> inputDict)
    {
        try
        {
            FilterWords flObj = new FilterWords();

            var dictionary = new Dictionary<string, int>();

            int idx = 0;

            var wordsToRemove = flObj.filterWords
                .Select(record => record.Substring(0, record.IndexOf(',')));

            foreach(string wrd in wordsToRemove)
            {
                inputDict.Remove(wrd);
            }

            dictionary = inputDict;

            return dictionary;
        }
        catch(Exception exp)
        {
            throw exp.GetBaseException();
        }
    }
 

Логика, вероятно, неправильная. Исключение, которое я получаю
Элемент с тем же ключом уже добавлен.

Трассировка стека —

     at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at    System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) 
    at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) at ....
 

использовался idx=0, потому что мне просто нужно значение по умолчанию 0 в значениях словаря. Логика казалась нормальной. Какое очень четкое и точное решение для этого. Любое критическое лямбда-выражение, которое может выполнить необходимое? Что не так с foreach в ‘wordsToRemove’ ?

Обратите внимание на мой опубликованный блок кода. Есть закомментированная строка dictionary=wordsToRemove .Выберите ………….Я попытался альтернативно прокомментировать это, и цикл foreach dictionary.Add. Error одинаков в обоих случаях.

** внимательно прочитайте комментарии, добавленные к блоку кода Thx.

Ответ №1:

Если вы хотите удалить, давайте Remove :

   List<string> filterWords = ...

  // I have a dictionary collection in format of Dictionary<string, int>, Like so
  Dictionary<string, int> dictionary = ...

 ... 

  // then we Remove each word in wordsToRemove from dictionary
  foreach (string word in filterWords)
    dictionary.Remove(word);  
 

Комментарии:

1. привет @DimitryBychenko — небольшое изменение. в исходном коде, который я опубликовал, была ошибка. Пожалуйста, проверьте список <string> фильтрующих слов сейчас. содержит только слова, без 0, которые я опубликовал изначально.

2. ошибка теперь равна -> Длина не может быть меньше нуля. Имя параметра: длина. Pl обратитесь к изменению в блоке кода List<string> filterwords.