C# 迭代器 foreach 循环

C# 也支持 foreach 循环,使用foreach可以迭代数组或者一个集合对象。

以下实例有三个部分:

通过 foreach 循环输出整型数组中的元素。 通过 for 循环输出整型数组中的元素。 foreach 循环设置数组元素的计算器。

class Program
{
    static void Main(string[] args)
    {
        int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
        foreach (int element in fibarray)
        {
            System.Console.WriteLine(element);
        }
        System.Console.WriteLine();


        // 类似 foreach 循环
        for (int i = 0; i < fibarray.Length; i++)
        {
            System.Console.WriteLine(fibarray[i]);
        }
        System.Console.WriteLine();


        // 设置集合中元素的计算器
        int count = 0;
        foreach (int element in fibarray)
        {
            count += 1;
            System.Console.WriteLine("Element #{0}: {1}", count, element);
        }
        System.Console.WriteLine("Number of elements in the array: {0}", count);
    }
}

输出了

0
1
1
2
3
5
8
13

0
1
1
2
3
5
8
13

Element #1: 0
Element #2: 1
Element #3: 1
Element #4: 2
Element #5: 3
Element #6: 5
Element #7: 8
Element #8: 13
Number of elements in the array: 8

只要有实现了 System.Collections.IEnumerable or System.Collections.Generic.IEnumerable 接口的类。 我们都可以用foreach例举它的所有元素 示例:如下。

class Program
   {
       static void Main(string[] args)
       {
           foreach (var item in new Test())
           {
               Console.WriteLine(item);
           }
       }

       public class Test : IEnumerable<string>
       {
           private List<string> Data = new List<string>() { "aa", "bb", "cc" };
           public IEnumerator<string> GetEnumerator()
           {
               return Data.GetEnumerator();
           }

           IEnumerator IEnumerable.GetEnumerator()
           {
               return Data.GetEnumerator();
           }
       }
   }

输出

aa
bb
cc

还可以直接用 yield 来生成一个 IEnumerable的接口 如下示例

    class Program
    {
        static void Main(string[] args)
        {
            var colors = Color();
            foreach (var item in colors)
            { 
               Console.WriteLine(item);
            }
        }

//使用yield可以让我们方便实现 IEnumerable
        public static IEnumerable<string> Color() //迭代器
        {
            yield return "red";
            yield return "green";
            yield return "blue";
        } 
    }  

输出

red
green
blue

string 这个类也是支持foreach的 从它的代码可以看到 public sealed class String : IEnumerable<char>

    class Program
    {
        static void Main(string[] args)
        {
            var s = "malema.net";
            foreach (var item in s)
            {
                Console.Write(item);
            }
        }
    }

输出

malema.net

推荐用 foreach替代 for.这样不会比较不会引起 边界问题

await foreach

从 C# 8.0 开始,您可以使用 await foreach 语句来消费异步数据流,即实现 IAsyncEnumerable 接口的集合类型。 当异步检索下一个元素时,可以暂停循环的每次迭代。 以下示例显示了如何使用 await foreach 语句:

await foreach (var item in GenerateSequenceAsync())
{
    Console.WriteLine(item);
}
上一篇:C# for 循环
下一篇:C# while 循环
最近更新的
...