2013-05-02 2 views

ответ

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

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

+0

@ClaudioRedi - Спасибо, я просто заметил эту ошибку. :) –

+2

Я бы изменил 'f.Value.Count> 0' на' f.Value.Any() ' – bnu

10

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

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. Это обычно проще, чем словарь, где каждое значение является списком, хотя они концептуально очень похожи. Поиск имеет приятную особенность, где, если вы запрашиваете отсутствующий ключ, вы получаете пустую последовательность вместо исключения или нулевой ссылки.

+0

При вызове ToList() создается новый список? Я не вижу разницы между созданием нового списка или созданием нового словаря. – Maro

+2

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

+0

Спасибо, я вижу вашу мысль. +1 – Maro

0

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

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

var list = dictionary[0]; 

// Do stuff with the list. 

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

Другие ответы рассмотреть вопрос о необходимости сделать это одноранговой по всему словарю.

Смежные вопросы