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

425
31 декабря 2016, 13:37

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

IDictionary<string, List<Model>>

есть модель

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

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

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

{"key1", {"Name1", <data>}, {"Name2", <data>}, {"Name3", <data>}}
{"key2", {"Name4", <data>}, {"Name2", <data>}, {"Name5", <data>}}

результат

{"key1", {"Name1", <data>}, {"Name2", <data>}, {"Name3", <data>}}
{"key2", {"Name4", <data>}, {"Name5", <data>}}

или

{"key1", {"Name1", <data>}, {"Name3", <data>}}
{"key2", {"Name4", <data>}, {"Name2", <data>}, {"Name5", <data>}}
Answer 1
HashSet<string> uniqueNames = new HashSet<string>();
foreach (KeyValuePair<string, List<Model>> pair in dict)
{
    foreach (Model model in pair.Value.ToList())
    {
        if (!uniqueNames.Add(model.Name))
        {
            pair.Value.Remove(model);
        }
    }    
}
Answer 2

Как развитие ответа Ruslan Artamonov. Чтобы не копировать список только ради того чтоб его перебрать - можно воспользоваться методом RemoveAll:

HashSet<string> uniqueNames = new HashSet<string>();
foreach (KeyValuePair<string, List<Model>> pair in dict)
{
    pair.Value.RemoveAll(model => !uniqueNames.Add(model.Name));
}

Этот способ работает быстрее на длинных списках (тот ответ имел квадратичную сложность относительно длины списка - этот имеет линейную сложность).

Но если длинных списков не предполагается - лучше использовать простой вложенный цикл ради читаемости кода.

READ ALSO
UpdatePanel не обновляется обратно

UpdatePanel не обновляется обратно

В форме есть DropDownList и CheckBoxList Значение в DropDownList должен меняться в зависимости от выбора CheckBoxList Поместил оба элемента в UpdatePanelЗначение в DropDownList...

379
Telegram Bot Api: упоминание пользователей (c#)

Telegram Bot Api: упоминание пользователей (c#)

Каким образом бот может упоминать пользователей, у которых нет никнейма?

514
Получить описание для SAML Authentication Context Class URI

Получить описание для SAML Authentication Context Class URI

Создаю SecurityToken с помощью Saml2SecurityToken следующим образом:

421
Чтение после конца потока невозможно. C#

Чтение после конца потока невозможно. C#

Всем доброго времени суток, столкнулся с проблемой

615