Удалить элемент из словаря, где значение-пустой список

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

IDictionary<int,Ilist<T>> 

3 ответов


var foo = dictionary
    .Where(f => f.Value.Count > 0)
    .ToDictionary(x => x.Key, x => x.Value);

Это создаст новая словарь. Если вы хотите удалить на месте, ответ Джона сделает трюк.


Ну, если вам нужно выполнить это на месте, вы можете использовать:

var badKeys = dictionary.Where(pair => pair.Value.Count == 0)
                        .Select(pair => pair.Key)
                        .ToList();
foreach (var badKey in badKeys)
{
    dictionary.Remove(badKey);
}

или если вы счастливы, создавая новая словарь:

var noEmptyValues = dictionary.Where(pair => pair.Value.Count > 0)
                              .ToDictionary(pair => pair.Key, pair => pair.Value);

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


альтернатива только для полноты.

альтернативно (и в зависимости от вашего использования), сделайте это в момент изменения содержимого списка на лету, а не в пакете в определенный момент времени. В такое время, как это, вероятно, вы будете знать ключ без необходимости повторять:

var list = dictionary[0];

// Do stuff with the list.

if (list.Count == 0)
{
    dictionary.Remove(0);
}

другие ответы касаются необходимости делать это ad-hoc по всему словарю.