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