Подсчет количества совпадение в списке

330
14 мая 2017, 21:17

Есть список слов. Хочу получить результирующий словарь в котором я бы мог получить количество одинаковых строк. Т.е. словарь будет содержать {слово;количество совпадений}.

Данный код делает это, но ооочень медленно. Что я не так сделал, что оно так тормозит

var file = File.ReadAllLines(@"1.txt").ToList();
var result = file
  .Select(str => new { Name = str, Count = file.Count(s => s == str) })
  .Where(obj => obj.Count > 1)
  .Distinct()
  .ToDictionary(obj => obj.Name, obj => obj.Count);
Answer 1

Воспользуйтесь словарем. Он обеспечивает быстрый поиск по ключу. В данном случае мы будем проверять существует ли слово в словаре. Если не существует — добавляем его, а счетчик устанавливаем в 1. И если существует — делаем поиск по ключу и увеличиваем счетчик на 1. Главной особенностью словарей, является то, что они имеют уникальные ключи, которые получаются путем извлечения хэш-кода значения. Формируется таблица хэш-кодов, которая обеспечивает быстрый поиск.

var dict = new Dictionary<string, int>();
foreach (var line in File.ReadLines(@"1.txt")){
    if (dict.ContainsKey(line)){
        dict[line]++;   
    } else {
        dict.Add(line, 1);  
    }
}

Как подсказал @VladD

По идее, лучше обойтись без материализации списка: ReadLines вместо ReadAllLines.

Сложность выполнения вашего кода будет равна O(N^2), а при использовании словаря — O(N).

Answer 2

Ну да, будет тормозить, у вас квадратичный алгоритм. Вы на каждой итерации перечитываете список заново.

Вам поможет GroupBy:

File.ReadLines(path)
    .GroupBy(s => s)
    .ToDictionary(g => g.Key, g => g.Count())

Если вам нужно выкинуть уникальные строки, нужно немного длиннее:

File.ReadLines(path)
    .GroupBy(s => s)
    .Select(g => (value: g.Key, count: g.Count()))
    .Where(t => t.count > 1)
    .ToDictionary(t => t.value, t => t.count)
READ ALSO
Алгебра 9 клас, help meee [требует правки]

Алгебра 9 клас, help meee [требует правки]

Ціну деякого товару спочатку знизили на 20% ,а потім підвищили на 30%Як і на скільки відсотків змінилася початкова ціна внаслідок цих двох переоцінок?

320
Syntax error, unexpected php [требует правки]

Syntax error, unexpected php [требует правки]

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /home/u870021518/public_html/revoltphp on line 44

450
Рабочий запрос не работает в MySQL 5.7 this is incompatible with sql_mode=only_full_group_by

Рабочий запрос не работает в MySQL 5.7 this is incompatible with sql_mode=only_full_group_by

При выполнении запроса из под php, появляется следующая ошибка: SELECT list is not in GROUP BY clause and contains nonaggregated column 'rusintechpt

538
apache отдает php как текст

apache отдает php как текст

Скопировал сайт с хостинга на локальный сервер openServer и столкнулся с проблемой, что сервер при ajax запросе к файлу, отдает его текст как естьТ

408