C # Производительность с коллекциями и итераторами - PullRequest
1 голос
/ 01 апреля 2019

Не могли бы вы объяснить, отличается ли подход, использованный в примере 1, по производительности от подхода в примере 2?Если да, какой из них наиболее эффективен и почему.

«Представления», о которых я говорю, имеют отношение не только к скорости выполнения.Я также хотел бы получить некоторые пояснения по поводу использования различных системных ресурсов.

1.

    private IEnumerable<string> GetObjectsStrings(List<object> input)
    {
        IList<string> result = new List<string>();

        foreach (var item in input)
        {
            result.Add(item.ToString());
        }

        return result;
    }

2.

    private IEnumerable<string> GetObjectsStrings(List<object> input)
    {
        foreach (var item in input)
        {
            yield return item.ToString();
        }
    }

Ответы [ 2 ]

4 голосов
/ 01 апреля 2019

В сценарии 1 вы обрабатываете весь список, а затем возвращаете этот список через интерфейс IEnumerable.Независимо от того, что звонящий намеревается сделать с возвращенным IEnumerable, весь список обрабатывается каждый раз, когда вызывается GetObjectsStrings.

В сценарии 2 вы обрабатываете только столько записей из списка inputкак того требует абонент.Итак, вы создаете итератор.

Вот пример, где это будет иметь значение:

var temp = GetObjectsStrings(input).First();

Сценарий 1: Вы обрабатываете input полностью длякаждый такой звонок, каждый раз.Сценарий 2: Вы обрабатываете только первый элемент в input.Затем итерация завершена.

1 голос
/ 01 апреля 2019

Они делают разные вещи, поэтому, безусловно, будет разница.

Первый - создание нового списка, который содержит ToString версию элементов из существующего списка, а затем возвращение этого новогоlist.

Второй выполняет итерацию по существующему списку и возвращает версию ToString без копирования.

2 является наиболее эффективным (с точки зрения скорости и использования памяти).), потому что нет новых списков, которые можно создавать или копировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...