Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

Исключить повторяющиеся значения из Dictionary

#c_sharp


Есть Dictionary, к примеру 

IDictionary>


есть модель 

public class Model 
{ 
   public string Name { get; set;}
   public byte[] Data { get; set;}
}


Как можно исключить повторяющиеся значения для Name во всем Dictionary? Отфильтровать
существующий словарь. Повторяющиеся значения Value необходимо удалять. Т.е. если в
ключе "Key1" и в ключе "Key2" в списке есть Name с одинаковым значением, то необходимо
исключить это значение для ключа (не важно какого)

тестовые данные

{"key1", {"Name1", }, {"Name2", }, {"Name3", }}
{"key2", {"Name4", }, {"Name2", }, {"Name5", }}


результат

{"key1", {"Name1", }, {"Name2", }, {"Name3", }}
{"key2", {"Name4", }, {"Name5", }}


или 

{"key1", {"Name1", }, {"Name3", }}
{"key2", {"Name4", }, {"Name2", }, {"Name5", }}

    


Ответы

Ответ 1



HashSet uniqueNames = new HashSet(); foreach (KeyValuePair> pair in dict) { foreach (Model model in pair.Value.ToList()) { if (!uniqueNames.Add(model.Name)) { pair.Value.Remove(model); } } }

Ответ 2



Как развитие ответа Ruslan Artamonov. Чтобы не копировать список только ради того чтоб его перебрать - можно воспользоваться методом RemoveAll: HashSet uniqueNames = new HashSet(); foreach (KeyValuePair> pair in dict) { pair.Value.RemoveAll(model => !uniqueNames.Add(model.Name)); } Этот способ работает быстрее на длинных списках (тот ответ имел квадратичную сложность относительно длины списка - этот имеет линейную сложность). Но если длинных списков не предполагается - лучше использовать простой вложенный цикл ради читаемости кода.

Комментариев нет:

Отправить комментарий