ホームページ  >  記事  >  バックエンド開発  >  C# のイテレータ

C# のイテレータ

王林
王林オリジナル
2024-09-03 15:04:08699ブラウズ

イテレータは、配列やリストなどで要素を取得し、反復を 1 つずつ実行するために使用されるメソッドです。 yield return ステートメントは、コレクションの要素を返すために iterator メソッドとともに使用され、yield Break は、コレクションの要素を返すために使用されます。反復を停止します。常に現在の位置を保存し、次の反復が行われるときに次の要素を返します。 IEnumerable および IEnumerator オブジェクトの値は、yield の戻り値の型です。このトピックでは、C# のイテレータについて学びます。

C# イテレータ メソッド

以下は、ループ、foreach ループ、列挙子などのさまざまなメソッドを使用した反復を示す例です。

1. For ループ

例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
static void Main(string[] args)
{
for (int i = 1; i <= 7; i++)
{
Console.WriteLine( i);
}
Console.WriteLine("Press Enter Key to Exit..");
Console.ReadLine();
}
}
}

for ループは 3 つのステートメントで構成されます。最初に初期化が実行され、次にブール式である条件が実行されます。その後、イテレータが実行されて、初期化された変数の値が変更されます。この for ループのプロセスは条件が false になるまで継続され、条件が false になると for ループは終了します。

出力:

C# のイテレータ

2. ForEach ループ

:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
static void Main(string[]args)
{
string[] values = new string[3] { "John", "Bob", "Eva" };
foreach (string name in values)
{
Console.WriteLine(name);
}
Console.WriteLine("Press Enter Key to Exit..");
Console.ReadLine();
}
}
}

キーワード内の foreach ループは、項目を反復するために使用されます。キーワードは、各反復で項目を選択するために使用されます。最初の項目は反復され、2 番目の項目以降の要素に格納されます。 foreach の反復回数は、コレクション内の要素の数によって異なります。この例では、コレクションは 3 つの値で構成されているため、foreach が 3 回実行され、値が表示されます。

出力:

C# のイテレータ

3.列挙子

例 #1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
public static IEnumerable<string> GetArray()
{
int[] array = new int[] { 12, 45, 56, 21, 4 };   // initializing array elements
foreach (var element in array)   // iterating array element
{
yield return element.ToString();   // returning elements
}
}
public static void Main(string[]args)         // main method
{
IEnumerable<string> elements = GetArray();  // storing array element
foreach(var element in elements)
{
Console.WriteLine(element);
Console.ReadKey();
}
}
}
}

この例では、5 つの要素を含む要素の配列があり、各要素の反復に foreach が使用されます。 yield ステートメントは、各反復後に要素を返すために使用されます。 IEnumerable インターフェイスは各要素を格納しますが、foreach は反復から返された要素を表示するために使用されます。このイテレータはメソッドで使用されます。

出力:

C# のイテレータ

例 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
public static IEnumerable<string> GetList()
{
List<string> list = new List<string>();
list.Add("Sunday");     // adding elements to list
list.Add("Monday");
list.Add("Tuesday");
list.Add("Wednesday");
list.Add("Thursday");
list.Add("Friday");
list.Add("Saturday");
foreach(var element in list)        //iteration of list elements
{
yield return element;               //returning elements after iteration
}
}
public static void Main(string[]args)    // main method
{
IEnumerable<string> elements = GetList();          // storing elements
foreach(var element in elements)
{
Console.WriteLine(element);
Console.ReadKey();
}
}
}
}

この例では、リスト コレクションが使用され、リストに要素を追加するために list.add メソッドが使用されます。ここでのリストは 7 つの要素で構成されています。 foreach は各要素の反復に使用されます。 yield ステートメントは、各反復後に要素を返すために使用されます。 IEnumerable インターフェイスは各要素を格納しますが、foreach は反復から返された要素を表示するために使用されます。

出力:

C# のイテレータ

例 #3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
public static void Main(string[] args)
{
foreach(var item in fib(6))  // iteration of elements
{
Console.WriteLine(item);
}
}
public static IEnumerable<int> fib(int number)
{
int x = 0, y = 1;
// yield return x;
//yield return y;
for (int i=0; i<=number; i++)
{
int temp = x;
x = y;
y = temp + y;
yield return y;        // returning the element
Console.ReadKey();
}
}
}
}

この例では、フィボナッチ数列が生成され、演算子で反復子が使用されます。これの実装は、メソッドでイテレータを使用したのと同じですが、この演算子ではものを返すために使用されます。

出力:

C# のイテレータ

例 #4

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Iterators
{
class Iterator
{
static void Main()
{
List<int> list = new List<int>();
list.Add(10);          // adding elements to list
list.Add(20);
list.Add(30);
list.Add(40);
list.Add(50);
list.Add(60);
list.Add(70);
List<int>.Enumerator a = list.GetEnumerator();
Write(a);
}
static void Write(IEnumerator<int> a)
{
while (a.MoveNext())
{
int value = a.Current;
Console.WriteLine(value);
Console.ReadKey();
}
}
}
}

上記の例ではリストコレクションを使用しています。 List.add メソッドは、リストに要素を追加するために使用されます。ここのリストには 7 つの要素が含まれています。 MoveNext と Current が使用されます。 MoveNext は基本的に次の要素が存在するかどうかを追跡し、要素が利用可能な場合は true、要素がない場合は false となるブール値を返しますが、現在の要素を取得するために current が使用されます。

出力:

C# のイテレータ

イテレーターの長所と短所

メリットとデメリットについては以下で説明します

メリット

  1. イテレーターはメソッドおよび取得アクセサーとして使用できます。
  2. 演算子またはプロパティとして使用できます。
  3. イテレータは読みやすく、実装も簡単です。
  4. 反復子は、ジェネリック コレクションと非ジェネリック コレクションで使用されます。

デメリット

  1. イテレータはリストのバックトラッキングには役に立ちません。
  2. 反復子は位置を保存するため、反復構造を更新できません。
  3. イテレータは、静的コンストラクター、静的ファイナライザー、インスタンス コンストラクターでは使用されません。

結論

値のシーケンスを走査するには、foreach ステートメントで反復子を使用できます。 Yield はイテレータとともに複数回使用して要素を返すことができます。実装は簡単で非常に便利です。

以上がC# のイテレータの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:C# での休止状態次の記事:C# での休止状態