Удалить несколько ключей с одинаковыми значениями данных из словаря в C # с помощью Linq - PullRequest
0 голосов
/ 08 мая 2018

Я знаю, что должен быть лучший способ сделать это ... может быть, с LINQ?Если я удаляю значение, он делает недействительным итератор, поэтому у меня это внутри бесконечного цикла, который запускает процесс заново.Я ищу способ сделать это так, чтобы его было легче читать, поддерживать и в конечном итоге намного быстрее.Вот что я получил:

Dictionary<string, string> Channels = //...;
while (true)
{
    var bFound = false;
    foreach(var c in Channels)
    {
        if(c.Value == version)
        {
            Channels.Remove(c.Key);
            bFound = true;
            break;
        }
    }
    if (!bFound) { break; }
}

Спасибо за любую помощь в оптимизации этой процедуры.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Судя по вашему примеру, вы удаляете на основе сравнения со значением версии.

Channels = Channels.Where(x=> x.Value != version)
              .ToDictionary(c => c.Key, c => c.Value);
0 голосов
/ 08 мая 2018

Я ищу способ сделать это так, чтобы его было легче читать, поддерживать и, в конечном итоге, гораздо быстрее

Просто используйте код ниже:

var keys = Channels.Keys.ToArray();
foreach(var key in keys)
{
    if(Channels[key] == version)
    {
        Channels.Remove(key);
    }
}

Для простоты LINQ не требуется. Пройдемся по словарю один раз для исполнения.

0 голосов
/ 08 мая 2018

Если вы фиксируете совпадения до удаления элементов из словаря, ваш перечислитель не будет признан недействительным.

List<KeyValuePair<string, string>> matches = Channels
  .Where(kvp => kvp.Value == version)
  .ToList();

foreach(KeyValuePair<string, string> match in matches)
{
  Channels.Remove(match.Key);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...