配列内の各要素を列挙するには、for文とforeach文が使えます。 for文では配列のインデックスを使って各要素を参照するのに対し、foreach文では個別の変数によって列挙された各要素を参照します。

forとforeachによる配列内の要素の列挙
using System;

class Sample {
  static void Main()
  {
    // 配列を作成
    string[] arr = {"Alice", "Bob", "Charlie"};

    // for文を使って配列内の各要素を列挙
    for (var i = 0; i < arr.Length; i++) {
      Console.WriteLine("arr[{0}] = {1}", i, arr[i]);
    }

    Console.WriteLine();

    // foreach文を使って配列内の各要素を列挙
    // (列挙した各要素は変数elemに代入される)
    foreach (var elem in arr) {
      Console.WriteLine(elem);
    }
  }
}
実行結果
arr[0] = Alice
arr[1] = Bob
arr[2] = Charlie

Alice
Bob
Charlie

foreach文では常に配列の先頭から一つずつ列挙されるため、配列の末尾から先頭に向けて列挙したり、一つ飛ばしで列挙したりといったことは出来ません。 そういった列挙が必要な場合はforeach文ではなくfor文を使って記述する必要があります。

for文とforeach文の使い分けは概ね以下のようになると言えます。

for文
列挙する際に要素の位置(インデックス)が重要となる場合
インデックスによって各要素に対して行う処理を振り分けたい場合(インデックスn以上の要素だけ参照したい、インデックスがnのときだけ処理を行いたいなど)
foreach文
列挙する際に要素の位置(インデックス)が重要でない場合
インデックスに関わらずすべての要素に同じ処理を行いたい場合

配列内から条件に合う要素を検索・取得したりするにはArrayクラスのFindメソッドやExistsメソッドなどを使うことができます。 また、配列内の要素の順番を逆にして列挙したい場合はReverseメソッドを使うことができます。

for文とforeach文による配列の列挙では、パフォーマンス上の差はほとんどありません。

foreach文での列挙は配列に実装されているIEnumerableインターフェイスから提供される機能によって実現しています。 配列とIEnumerableインターフェイスについては後述の§.配列のインターフェイス、IEnumerableインターフェイスと列挙についてはIEnumerable・IEnumeratorで詳しく解説しています。