Помочь с алгоритмом
Всем привет. Решаю задачу и не могу придумать алгоритм решения. Алгоритм я имею ввиду псевдокод, пошаговое руководство по решению задачи. Впринципе суть задачи я понял, но вот алгоритмизация хромает. Вот сама задача:
У нас есть список в котором записано имя человека и его имейл. Это можно представить как-то так: name:email. Так-же у нас есть определенный метод который принимает на вход как я уже говорил список имен и имейлов и он должен вернуть словарь, ключом которого должны быть первые две или одна буква имени, а значение словаря это тот самый список в котором записаны имена и имейлы людей. То есть по сути нам нужно написать первые две или одну букву имени и затем программа должна найти имена начинающиеся с этих букв и записать их в значение словаря.
Вот сам метод:
private static Dictionary<string, List<string>> OptimizeContacts(List<string> contacts)
Ребят, помогите понять сам алгоритм решения задачи, а код я уже сам напишу
Ответы (2 шт):
Алгоритм такой: для каждой строки s = "Вася:[email protected]" выделяем подстроку start из двух первых букв (в данном случае "Ва", также надо предусмотреть случаи однобуквенного имени и его отсутствия)
Проверяем, есть ли в словаре ключ start. Если да - добавляем к имеющемуся значению для данного ключа (списку) строку s. Если нет - создаём новый список list с единственной строкой s и добавляем новый элемент словаря из пары start; list
Посмотрите в сторону типа Lookup<> (system.linq.lookup), этот тот тип словаря что вам нужен, а для вариантов что искать по одному/двум символам сразу не получится, либо тогда два словаря заводить, либо постоянно фильтровать на лету. Никакой другой вариант (одновременно под один и под 2 символа) более быстрым не получится.
Пример с Lookup<>, запись в словарь:
List<string> list = new List<string>();
list.Add("name1:email1");
list.Add("name1:email2");
list.Add("name2:email3");
list.Add("name2:email4");
Lookup<string, string> ldic =
(Lookup<string, string>)list.ToLookup(c => c.Split(':')[0], c => c.Split(':')[1]);
Фильтр поиск, например "name1" (вот тут можно вводить хоть 1, хоть 2 первых символа):
IEnumerable<IGrouping<string, string>> result
= ldic.TakeWhile(w => w.Key.StartsWith("name1"));
result.ToList().ForEach(a => a.ToList().ForEach(b=>WriteLine(a.Key+":"+b)));
В выдаче будет:
name1:email1
name1:email2