Задача
Найти сумму всех уникальных цифр в строке
Решение
Данную задачу можно решить двумя путями: используя HashSet<int> плюс циклы и используя LINQ. В этой статье я хочу показать отличие этих двух подходов и сравнить их по производительности.
Используем LINQ
int sum = (int)input // коллекция chars .Where(x => char.IsNumber(x)) // находим все char, которые являются числом .Select(x => char.GetNumericValue(x)) // конвертируем char в число .Distinct() // берем только уникальные значения .Sum(); // считаем сумму
Используем HashSet и циклы
HashSet<int> numbers = new HashSet<int>(); foreach (char c in input) if (char.IsNumber(c)) numbers.Add((int)char.GetNumericValue(c)); int sum = 0; foreach (int n in numbers) sum += n;
Основным преимущество LINQ является его краткость и расширяемость. Давайте проведем нагрузочный тест и сравним результаты. На вход подаем строку из 10000 символов и проводим 10000 итераций (скриншот выше). Получаем следующие результаты
- 00:00:01.7066307 (LINQ)
- 00:00:01.3255282 (HashSet)
Мы видем, что LINQ проседает на 23%. Изячность или производительность!? - решение принимать вам!
Исходный код на Visual Studio 2015 в закрепленном файле выше.
dmytro