Словарь: свойство или индексатор не могут быть назначены: оно только для чтения - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь изменить значение ключей в моем словаре следующим образом:

//This part loads the data in the iterator
List<Recommendations> iterator = LoadBooks().ToList();
//This part adds the data to a list 
List<Recommendations> list = new List<Recommendations>();

        foreach (var item in iterator.Take(100))
        {
            list.Add(item);
        }
        //This part adds Key and List as key pair value to the Dictionary
        if (!SuggestedDictionary.ContainsKey(bkName))
        {
            SuggestedDictionary.Add(bkName, list);

        }
       //This part loops over the dictionary contents 
  for (int i = 0; i < 10; i++)
        {
            foreach (var entry in SuggestedDictionary)
            {
                rec.Add(new Recommendations() { bookName = entry.Key, Rate = CalculateScore(bkName, entry.Key) });
                entry.Key = entry.Value[i];
            }

        }

Но там написано "Свойство или индексатор KeyValuePair> .Key Невозможно назначить. Доступно только для чтения. Что я хочу сделать, так это изменить здесь значение словаря Key и присвоить ему другое значение.

1 Ответ

0 голосов
/ 19 января 2019

Единственный способ сделать это - удалить и снова добавить элемент словаря

Почему?Это потому, что словарь работает с процессом, называемым цепочкой и сегментами (он похож на хеш-таблицу с другой стратегией разрешения коллизий)

enter image description here

Когда элементдобавленный в словарь, он добавляется в корзину, к которой привязывается его ключ, и, если там уже есть экземпляр, он добавляется в цепочечный список.Если вам нужно сменить ключ, он должен будет пройти через процесс определения, где он принадлежит.Таким образом, самое простое и разумное решение - просто удалить и повторно добавить элемент

Решение

var data = SomeFunkyDictionary[key];
SomeFunkyDictionary.Remove(key);
SomeFunkyDictionary.Add(newKey,data);

Или сделать свой метод расширения

public static class Extensions
{
   public static void ReplaceKey<T, U>(this Dictionary<T, U> source, T key, T newKey)
   {
      if(!source.TryGetValue(key, out var value))
         throw new ArgumentException("Key does not exist", nameof(key));
      source.Remove(key);
      source.Add(newKey, value);
   }
}

Использование

SomeFunkyDictionary.ReplaceKey(oldKye,newKey);

Примечание : добавление и удаление из словаря влечет за собой штраф, если вам не нужно быстропоиски, может быть более подходящим вообще не использовать словарь или использовать какую-то другую стратегию.

...