相关疑难解决方法(0)

不使用,foreach或手动调用Dispose()时的枚举器处理

我正在使用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)

c# enumeration enumerator yield-return

6
推荐指数
1
解决办法
3544
查看次数

无限循环的数据结构

我正在寻找一个可以填充项目的数据结构,就像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)

c#

0
推荐指数
1
解决办法
295
查看次数

标签 统计

c# ×2

enumeration ×1

enumerator ×1

yield-return ×1