GroupCollectionクラスは、名前の通り複数のGroupを格納するためのコレクションクラスです。 Match.Groupsプロパティの型はGroupCollectionとなっていて、マッチした正規表現のグループすべてに対応するGroupが格納された状態で返されます。
Match.Groupsプロパティはインデクサによってグループ番号・グループ名に対応するGroupを取得することができるほか、foreach/For Eachによってすべてのグループを列挙することもできます。 このとき、正規表現内にグループが含まれているかどうかに関わらず、常にマッチ箇所全体を表すグループが列挙されます。
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で解説しています。