我正在使用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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用这个被接受的答案的改编版本来"拉"许多迭代器:
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 …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个可以填充项目的数据结构,就像IEnumerator调用MoveNext()一样,但是当它到达列表的末尾时会自动循环回到开头.我可以想到两种方法来做到这一点,要么使用链接列表并将其链接到自身,要么只是编写逻辑来检查IEnumerator.Current是否为空并重置,两者都相当简单,但我想先检查是否存在在框架中已经可以做到这一点.
它看起来像这样:
public interface IInfiniteEnumerable<T>
{
bool MoveNext();
T Current();
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据答案,这可以解决问题:
class Program
{
static void Main(string[] args)
{
var lst = new List<string>
{
"A",
"B",
"C"
};
IEnumerator<string> enumerator = lst.RepeatIndefinitely().GetEnumerator();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
enumerator.MoveNext();
Console.WriteLine(enumerator.Current);
Console.ReadLine();
}
}
public static class Extensions
{
public static IEnumerable<T> RepeatIndefinitely<T>(this IEnumerable<T> source)
{
while (true)
{
foreach (var item in source)
{
yield return item; …Run Code Online (Sandbox Code Playgroud)