На самом деле, при условии MarshalByRefObject
, это 2 поездок за единицу (плюс один); один к MoveNext()
и один к Current
(для каждого MoveNext()
, который возвращает true
). Плюс GetEnumerator()
звонок, и, вероятно, Dispose()
. Так что для MarshalByRefObject
нет: не делай этого; использовать массив.
Однако, если это не MarshalByRefObject
, это более интересно. Например, ADO.NET Data Services предоставляет данные в API LINQ (IQueryable<T> : IEnumerable<T>
), но это работает путем создания определенного запроса при необходимости, выполнения одного цикла и повторения итерации на клиенте.
Конечно, вам, вероятно, не следует использовать удаленное взаимодействие на любом реальном расстоянии (предпочтительнее WCF и т. Д.), Поэтому, возможно, первый сценарий не является огромной проблемой - вы выиграли много задержки. Кроме того, у вас возникнут те же проблемы с задержкой на объектах (если MarshalByRefObject
) или затраты на сериализацию (если нет).
Лично, в очень немногих случаях, когда я использую удаленное взаимодействие (обычно просто для того, чтобы разрешить выгрузку dll), у меня есть MarshalByRefObject
для представления некоторого вида сервиса и сериализуемых объектов сущности. Возможно, для меня это вполне предсказуемо, я использую protobuf-net, чтобы минимизировать стоимость сериализации.