1) Для тестов производительности используется benchmarkdotnet
2) Зачем добавлять результат в новый лист, и возвращать его? Это уже Select а не foreach
3) Потому что Linq работает с IEnumerable. а ты с IList, т. е. ты обращаещься напрямую через индекс
4) методы с enumerable.ToList().Foreach вообще дичь какая то, зачем они нужны? не понятно, зачем вообще делать ToList? бессмысленная аллокация
benchmarkdotnet - хорошо, сейчас изучу) Был не в курсе)
Вообще я поиграть решил с этими методами. Типо методы расширения, типо можно сократить код с циклом foreach. Потому что на моей практике объёмных инструкций в этом цикле не встречалось. И захотелось бахнуть такой метод, которой просто возьмёт и будет применять к каждому элементу определённую функцию.
Причём я вот буквально только узнал, что LINQ в открытом доступе лежит. И например Select не работает с функциями типа делегата Action<TInput>.
Есть метод ForEach , который у List есть. Он уже с Action работает. Поиграюсь с benchmarkdotnet. Разницы всё равно ощутимой не будет.
По большому счету хотелось даже не LINQ переделать, а просто бахнуть метод, который уменьшит объём кода.
Просто за основу взял Select