Удаление перечислителя, когда он не использует, foreach или вручную вызывает Dispose ()

м используюyield return перебиратьSqlDataReaderзаписи: я

IEnumerable GetReadings() {
    using (var connection = new SqlConnection(_connectionString))
    {
        using (var command = new SqlCommand(_query, connection))
        {
            connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new Reading
                    {
                        End = reader.GetDateTime(0),
                        Value = reader.GetDouble(1)
                    };
                }
            }
            connection.Close();
        }
    }
}

м, используя адаптированную версиюэтот принятый ответ к "застежка-молния» много итераторов вместе:

   var enumerators = data.Select(d => new
   {
       d.Key,
       Enumerator = d.Value.GetEnumerator()
   }).ToList();

   while (true)
   {
       foreach (var item in enumerators)
       {
           if (!item.Enumerator.MoveNext())
           {
               yield break;
           }

           /*snip*/
       }

      /*snip*/
   }

В методе выше перечислительDispose() явно не вызывается, и потому что они не используются вusing или жеforeach Скажите, будет ли основной итератор оставаться в открытом состоянии? В моем случае с открытым.SqlConnection

Должен ли я звонитьDispose() на счетчиках, чтобы убедиться, что вся цепочка вниз по течению замкнута?

Ответы на вопрос(2)

Ваш ответ на вопрос