Есть список слов. Хочу получить результирующий словарь в котором я бы мог получить количество одинаковых строк. Т.е. словарь будет содержать {слово;количество совпадений}.
Данный код делает это, но ооочень медленно. Что я не так сделал, что оно так тормозит
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);
Воспользуйтесь словарем. Он обеспечивает быстрый поиск по ключу. В данном случае мы будем проверять существует ли слово в словаре. Если не существует — добавляем его, а счетчик устанавливаем в 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).
Ну да, будет тормозить, у вас квадратичный алгоритм. Вы на каждой итерации перечитываете список заново.
Вам поможет 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)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Ціну деякого товару спочатку знизили на 20% ,а потім підвищили на 30%Як і на скільки відсотків змінилася початкова ціна внаслідок цих двох переоцінок?
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /home/u870021518/public_html/revoltphp on line 44
При выполнении запроса из под php, появляется следующая ошибка: SELECT list is not in GROUP BY clause and contains nonaggregated column 'rusintechpt
Скопировал сайт с хостинга на локальный сервер openServer и столкнулся с проблемой, что сервер при ajax запросе к файлу, отдает его текст как естьТ