Задать вопрос
@Nikkuz39

C# цикл FOR (вопрос по тестовому заданию)?

Из тестового задания:

Укажите проблемные места этого кода и/или как их исправить:
Используется язык C#


List<string> GetNames() 
{
   List<string> ss = new List<string>();
   for (int i = 0; i < 10000000; i++) {
       ss.Insert(0, GetName(i)); // GetName - это просто какая-то функция, которая возвращает нам строку
   }
   return ss;
}


В чём подвох?
  • Вопрос задан
  • 231 просмотр
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@oleg_ods
Если предположить что цель метода вернуть List с именами в обратном порядке, то можно развернуть цикл и метод Insert заменить на Add.

List<string> GetNames() 
{
   List<string> ss = new List<string>();
   for (int i = 10000000; i >= 0; i--) {
       ss.Add(GetName(i)); // GetName - это просто какая-то функция, которая возвращает нам строку
   }
   return ss;
}


List под капотом содержит массив.
Принцип работы метода Insert:
1) Проверить достаточно ли места во внутреннем массиве. См. свойство Capacity.
2) Если недостаточно, то расширить массив в 2 раза.
3) Сместить все последующие элементы на одну позицию вперед.
4) Добавить в нужный индекс значение.

Принцип работы метода Add:
1) Проверить достаточно ли места во внутреннем массиве. См. свойство Capacity.
2) Если недостаточно, то расширить массив в 2 раза.
3) Вставить значение в конец массива.

Соответственно при использовании метода Insert, в Вашем случае, будет очень много операций копирования значений.

Второе, если на момент создания List в методе известно кол-во элементов которые он должен содержать, то можно использовать конструктор List(int capacity), который изначально создаст List нужного размера. Так Вы избавитесь от необходимости динамически расширять List при переполнении внутреннего массива.

P.S. Для общего образования можете погонять альтернативные реализации методов через библиотеку DotNetBenchmark и сравнить на сколько вырастет производительность в каждом случае.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы