GroupCollectionクラスは、名前の通り複数のGroupを格納するためのコレクションクラスです。 Match.Groupsプロパティの型はGroupCollectionとなっていて、マッチした正規表現のグループすべてに対応するGroupが格納された状態で返されます。

Match.Groupsプロパティはインデクサによってグループ番号・グループ名に対応するGroupを取得することができるほか、foreach/For Eachによってすべてのグループを列挙することもできます。 このとき、正規表現内にグループが含まれているかどうかに関わらず、常にマッチ箇所全体を表すグループが列挙されます。

Match.Groupsプロパティからすべてのグループを列挙する
using System;
using System.Text.RegularExpressions;

class Sample {
  static void Main()
  {
    var text = "2016-02-29 00:00:00";
    var pattern = @"(\d{4})-(\d{2})-(\d{2})"; // yyyy-mm-dd形式の日付

    var m = Regex.Match(text, pattern);

    if (m.Success) {
      // Match.Groupsプロパティから、すべてのグループを取得して表示する
      // (GroupCollectionは非ジェネリックで型指定されていないIEnumeratorを返すため、varによる暗黙的な型指定はできない)
      foreach (Group g in m.Groups) {
        Console.WriteLine(g.Value);
      }
    }
  }
}
実行結果
2016-02-29
2016
02
29

GroupCollectionは当初、非ジェネリックなIEnumerableのみを実装した型指定されていないコレクションとして登場し、その後.NET Standard 2.1/.NET Core 2.0にてIEnumerable<Group>/ICollection<Group>/IList<Group>を実装するようになり、型指定されたコレクションとして扱うことができるようになっています。

一方、IEnumerable<Group>の実装以降でも、GroupCollection.GetEnumeratorメソッドは(おそらく)互換性のため型指定されていないIEnumeratorを返す実装のままとなっています。 このため、GroupCollectionをforeachで列挙する場合、varによる暗黙的な型指定を行うとobjectとして列挙されます

代替手法やGroupCollectionのジェネリックインターフェイスについてより詳しくは§.MatchCollection・GroupCollection・CaptureCollectionとジェネリックコレクションインターフェイスを参照してください。

.NET Core 3.0以降では、GroupCollectionはIReadOnlyDictionary<string, Group>インターフェイスを実装しています。 これにより、GroupCollectionをDictionaryと同様に扱うことができるようになっています。 詳しくは§.GroupCollectionとIReadOnlyDictionaryで解説しています。