我正在使用yield return
来遍历一个SqlDataReader
的记录:
IEnumerable<Reading> 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()
来确保整个下游链路都关闭了呢?
using
语法?当块上下文结束时,包括yield
和return
时,它会自动调用。 - Yuckusing
包装起来变得困难。 - Oliver