Как изменить значение KeyValuePair в списке как значение в словаре? - PullRequest
0 голосов
/ 25 октября 2018

У меня довольно сложный случай.Я хочу изменить значение KeyVluePair в этом словаре -> Dictionary<string, List<KeyValuePair<string, int>>>

Пока я сделал это, но я не знаю, как продолжить:

string input = Console.ReadLine();
Dictionary<string, List<KeyValuePair<string, int>>> dworfs = new Dictionary<string, List<KeyValuePair<string, int>>>();
while (input != "Once upon a time")
{
   string[] elements = input.Split(new[] { " <:> " }, StringSplitOptions.RemoveEmptyEntries);
   if (dworfs.ContainsKey(elements[0]))
   {
      if (dworfs[elements[0]].Any(x => x.Key.Contains(elements[1])))
      {
         var dworf = dworfs[elements[0]].FirstOrDefault(x => x.Key == elements[1]);
         if (dworf.Value < int.Parse(elements[2]))
         {
            dworfs[elements[0]].FirstOrDefault(x => x.Key == elements[1]) = new KeyValuePair<string,int> (elements[1], int.Parse(elements[2]));
         }
      }
      else
      {
         dworfs[elements[0]].Add(new KeyValuePair<string, int>(elements[1], int.Parse(elements[2])));
      }
   }
   else
   {
      dworfs.Add(elements[0], new List<KeyValuePair<string, int>> { new KeyValuePair<string, int> (elements[1], int.Parse(elements[2])) });
   }
   input = Console.ReadLine();
}

Этострока dworfs[elements[0]].FirstOrDefault(x => x.Key == elements[1]) = new KeyValuePair<string,int> (elements[1], int.Parse(elements[2])); дает мне ошибку Левая часть присваивания должна быть переменной, свойством или индексатором .Я не знаю, как назначить значение.Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Сообщение об ошибке описывает проблему, FirstOrDefault() вернется со значением, которое может использоваться только в качестве правой части выражения.Вы не можете присвоить значения результатам метода.

Попробуйте это:

var index = dworfs[elements[0]].IndexOf(dworf);
dworfs[elements[0]][index] = new KeyValuePair<string,int> (elements[1], int.Parse(elements[2]));

Имейте в виду, что FirstOrDefault() может возвращать ноль, но вы не проверяете этот случай в своем коде,это может привести NullReferenceException с.

0 голосов
/ 25 октября 2018

Если бы KeyValuePair было Dictionary, у вас было бы больше шансов.

Однако

var dwarf = dworfs[elements[0]];
var obj = dwarf.FirstOrDefault(x => x.Key == elements[1]);
var index = dwarf.IndexOf(obj);

dwarf[index] = new KeyValuePair<string, int>(elements[1], int.Parse(elements[2]));

Совет вам не нужно делать все наодна строка

...