Фильтр словаря строковый ключ, список объектов, где объект содержит значение свойства - PullRequest
0 голосов
/ 31 мая 2018

Привет, у меня есть этот объект

public class Field 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Dictionary<string, List<Field>> fields = new Dictionary<string, List<Field>>();

fields.Add(
     "pippo", 
     new List<Field>() { 
         new Field() { Name = "1" }, 
         new Field() { Name = "2" }, 
         new Field() { Name = "3" } 
});

fields.Add(
     "pluto", 
     new List<Field>() { 
         new Field() { Name = "1" }, 
});

fields.Add(
     "paperino", 
     new List<Field>() { 
         new Field() { Name = "3" } 
});

Я хочу удалить из словаря все ключи, которые не имеют в значениях строку «1» в поле имени, как в примере ниже

fields: key "pippo" value { { Name = "1" }, { Name = "2" }, { Name = "3" } }
        key "pluto" value { { Name = "1" }}

Ответы [ 3 ]

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

Один из способов сделать это - использовать linq:

var result = fields
    .Where(f => f.Value.Any(x => x.Name == "1"))
    .ToDictionary(k => k.Key, v => v.Value);

Обратите внимание, что это не изменит исходный словарь, но вернет новый диктатор.Если вы хотите изменить исходный словарь, просто используйте его вместо var result - fields = fields.Where....

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

Используйте Where вызов, за которым следует ToDictionary:

fields = fields.Where(x => x.Value.Any(y => y.Name == "1"))
               .ToDictionary(x => x.Key, x => x.Value);
0 голосов
/ 31 мая 2018

Если вы хотите изменить существующий словарь, почему бы не найти ключи и затем удалить их?

var keysToRemove = fields
  .Where(pair => !pair.Value.Any(item => item.Name == "1"))
  .Select(pair => pair.Key);

foreach (var key in keysToRemove)
  fields.Remove(key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...