Подтвердить что ты не робот

Создание словаря из другого словаря с использованием LINQ

У меня есть словарь типа:

IDictionary<foo, IEnumerable<bar>> my_dictionary

класс bar выглядит следующим образом:

class bar
{
    public bool IsValid {get; set;} 
}

Как я могу создать другой словарь, содержащий только те элементы, которые имеют IsValid = true.

Я пробовал это:

my_dictionary.ToDictionary( p=> p.Key,
                            p=> p.Value.Where (x => x.IsValid));

Проблема с приведенным выше кодом заключается в том, что это создает ключ с пустым перечисляемым, если все элементы для этого ключа были IsValid = false.

например:

my_dictionar[foo1] = new List<bar> { new bar {IsValid = false}, new bar {IsValid = false}, new bar {IsValid = false}};
my_dictionary[foo2] = new List<bar> {new bar {IsValid = true} , new bar{IsValid = false};
var new_dict = my_dictionary.ToDictionary( p=> p.Key,
                            p=> p.Value.Where (x => x.IsValid));
// Expected new_dict should contain only foo2 with a list of 1 bar item.
// actual is a new_dict with foo1 with 0 items, and foo2 with 1 item.

Как мне получить ожидаемое.

4b9b3361

Ответ 1

Что-то вроде этого?

my_dictionary
    .Where(p=> p.Value.Any(x => x.IsValid))
    .ToDictionary( p=> p.Key,
                   p=> p.Value.Where (x => x.IsValid));

Это будет включать только те элементы, где хотя бы одно из значений IsValid.

Ответ 2

my_dictionary.Where(p => p.Any(v => v.Value.IsValid())
             .ToDictionary(p=> p.Key,
                           p=> p.Value.Where(x => x.Value.IsValid());

Получите только те элементы, которые имеют значение true в значении, а затем получают только те предметы, которые верны в новый диктатор.

Затем фильтр создаст диктофон

Ответ 3

var new_dict = my_dictionary.Select(x => new KeyValuePair<foo, List<bar>>(
                                                 x.Key,
                                                 x.Value
                                                  .Where(y => y.IsValid)
                                                  .ToList()))
                            .Where(x => x.Value.Count > 0)
                            .ToDictionary(x => x.Key, x => x.Value.AsReadOnly());