Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/75: Рейтинг темы: голосов - 75, средняя оценка - 4.65
24 / 6 / 3
Регистрация: 06.12.2015
Сообщений: 319
1

Поиск имен в Dictionary по первым двум буквам

15.03.2017, 17:37. Показов 15078. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание такое:
"В отпуске Вася не тратил время зря, а заводил новые знакомства. Он знакомился с другими крутыми программистами, отдыхающими с ним в одном отеле, и записывал их email-ы.
В его дневнике получилось много записей вида <name>:<email>.
Чтобы искать записи было быстрее, он решил сделать словарь, в котором по двум первым буквам имени можно найти все записи его дневника.
Вася уже написал функцию GetContacts, которая считывает его каракули из блокнота. Помогите ему сделать все остальное!"
Я вроде посмотрел возвращает верное значение словаря. А чеккер на сайт с он-лайн курсами по программированию не принимает(скрин снизу). Я метод GetContacts() написал просто, чтобы удобно было отлаживать задание и не все элементы списка туда внес. Если начнете разбираться желательно слишком не усложнять код. Заранее спасибо!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace UsefullAcquaintancesTask
{
    class Program
    {
        private static List<string> GetContacts()
        {
            List<string> contacts = new List<string>();
            contacts.Add("Ваня:v@mail.ru");
            contacts.Add("Вася:vasiliy@gmail.com");
            contacts.Add("Ваня:ivan@grozniy.ru");
            contacts.Add("Саша:sasha1995@sasha.ru");
            contacts.Add("Саша:alex@nd.ru");
            contacts.Add("Паша:pavel.egorov@urfu.ru");
            contacts.Add("Юрий:dolg@rukiy.ru");
            contacts.Add("Гена:genadiy.the.best@inbox.ru");
            return contacts;
        }
        private static Dictionary<string, List<string>> OptimizeContacts(List<string> contacts)
        {
            var dictionary = new Dictionary<string, List<string>>();
            contacts.AddRange(GetContacts());
            string keyForSearch = Console.ReadLine();
            List<string> list = 
                (from a in contacts where a.StartsWith(keyForSearch)select a).ToList<string>();
            if (!dictionary.ContainsKey(keyForSearch)) dictionary[keyForSearch] = list;            
            return dictionary;
        }
 
        static void Main(string[] args)
        {
            var dict = OptimizeContacts(new List<string>());
        }
    }
}
Миниатюры
Поиск имен в Dictionary по первым двум буквам  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2017, 17:37
Ответы с готовыми решениями:

Поиск по первым буквам в классе Dictionary
Привет всем! В общем есть пара вопросов: 1) как сделать поиск по первым словам в слове как на...

Поиск файлов в директории по первым буквам их имен
Вообщем проблема вот в чем - Есть текстбокс который называется &quot;Поиск&quot;. Короче смысл такой же как и...

Поиск и автоматический переход в списке по первым буквам их имен
Добрый вечер . Имеется форма по коду или названию выбираем товар и заносим в таблицу . Как...

Организуйте поиск номера телефона по первым двум буквам фамилии.
Файл содержит фамилии и номера телефонов, организуйте поиск номера телефона по первым двум буквам...

7
24 / 6 / 3
Регистрация: 06.12.2015
Сообщений: 319
15.03.2017, 17:51  [ТС] 2
http://https://ulearn.me/Cours... e54bec88c8
Вот ссылка на данную задачу.
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
15.03.2017, 18:59 3
Лучший ответ Сообщение было отмечено Mnemonik39 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
private static Dictionary<string, List<string>> OptimizeContacts(List<string> contacts)
{
    var dictionary = new Dictionary<string, List<string>>();
    foreach(var c in contacts)
    {
        var key = string.Concat(c.Split(new char[]{':'})[0].Take(2));
        if(!dictionary.ContainsKey(key)) dictionary.Add(key,contacts.Where(x=>x.StartsWith(key)).ToList());
    }
    return dictionary;
}
3
24 / 6 / 3
Регистрация: 06.12.2015
Сообщений: 319
15.03.2017, 19:01  [ТС] 4
Большое спасибо. Тепреь и я понял в чем ошибка
0
746 / 487 / 187
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
15.03.2017, 19:01 5
Mnemonik39, ваш метод плох по нескольким причинам:
0) В параметрах метод принимает List. Подразумевается, что в нем уже находится список контактов. А вы заполняете его внутри, вызывая метод GetContacts().
1) Считывать что-либо с консоли внутри метода, который формирует словарь - очень нехорошо. И в данном случае вообще не нужно по заданию.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static Dictionary<string, List<string>> OptimizeContacts(List<string> contacts)
{
    var dictionary = new Dictionary<string, List<string>>();
        
    foreach (var contact in contacts)
    {
        var name = contact.Split(':')[0];
        var namePrefix = (name.Length <= 2) ? name : name.Substring(0, 2);
            
        if (dictionary.ContainsKey(namePrefix))
        {
            dictionary[namePrefix].Add(contact);
        }
        else
        {
            dictionary[namePrefix] = new List<string>() { contact };
        }
    }
        
    return dictionary;
}
3
24 / 6 / 3
Регистрация: 06.12.2015
Сообщений: 319
15.03.2017, 19:17  [ТС] 6
Спасибо за Ваши замечания. Вы не могли бы пояснить почему именно так происходит?) Мы же должны куда-то ввести эти первые две буквы, чтобы сравнить их с теми элементами списка, которые будут совпадать? Я сейчас смотрю на то, что вы написали (причем проверил чеккером и это работает) и все равно не понимаю, почему мы берем именно из списка с контактами, а не из строки. И не понятно ещё зачем они этот метод GetContacts() упомянули.
0
746 / 487 / 187
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
16.03.2017, 12:03 7
Mnemonik39, так происходит, потому что задания плохо сформулированы, имхо.
Вы описываете метод, а тестирующая система сама подставляет нужные значения, поэтому самому ничего считывать не надо. И поэтому сказано, что есть некий реализованный метод GetContacts, который уже умеет отдавать в ваш метод OptimizeContacts готовые для обработки данные.
Повторюсь, что условия на том ресурсе (не только в этом задании) поставлены не самым очевидным образом.
2
269 / 253 / 186
Регистрация: 28.10.2015
Сообщений: 723
17.03.2017, 07:34 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
 
class Program
{
    public static void Main()
    {
        Regex re = new Regex(@"^((.{1,2}).*?):(.*)$", RegexOptions.Compiled);
        Dictionary<string, List<Tuple<string, string>>> dict = new string[]
        {
            "Ваня:v@mail.ru",
            "Вася:vasiliy@gmail.com",
            "Ваня:ivan@grozniy.ru",
            "Саша:sasha1995@sasha.ru",
            "Саша:alex@nd.ru",
            "Паша:pavel.egorov@urfu.ru",
            "Юрий:dolg@rukiy.ru",
            "Гена:genadiy.the.best@inbox.ru",
            "Вова своё мыло не дал",
            "Ы:strannoe.imya@odna.ko"
        }
            .Select(s => { Match m = re.Match(s); return m.Success ? Tuple.Create(m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value) : null; })
            .Where(x => x != null)
            .GroupBy(t => t.Item2)
            .ToDictionary(g => g.Key, g => g.Select(t => Tuple.Create(t.Item1, t.Item3)).ToList());
            foreach (var kv in dict)
            {
                Console.WriteLine(kv.Key);
                kv.Value.ForEach(Console.WriteLine);
                Console.WriteLine();
            }
    }
}
0
17.03.2017, 07:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2017, 07:34
Помогаю со студенческими работами здесь

Список студентов рассортировать в алфавитном порядке по двум первым буквам фамилии
Здравствуйте все))) помогите решить 'одну задачку)) Список студентов (фамилия, имя, отчество)...

Удаление фамилии из списка по первым двум буквам (или по первой и последней букве)
Рерят, мне нужно чтобы третья кнопка удаляла фамилию и имя из списка по первым двум или по первой и...

Поиск по двум буквам в массиве
Здравствуйте, я не очень разбираюсь в JS, поэтому помогите пожалуйста вот с такой проблемой: мне...

Поиск по первым буквам в StringGrid
Здравствуйте есть база данных StringGrid, есть поиск , но как сделать что бы искало по первым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru