Назад к вопросам
Junior
114
questionbank
Какие типы объектов можно использовать в цикле foreach в C#?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В цикле foreach в C# можно использовать любые типы объектов, реализующие один из следующих интерфейсов:
System.Collections.IEnumerable- Для неуниверсальных коллекций. Предоставляет неуниверсальный перечислительIEnumerator.System.Collections.Generic.IEnumerable<T>- Для универсальных коллекций. Предоставляет универсальный перечислительIEnumerator<T>.
Класс или структура также могут использоваться в foreach, если они имеют публичный метод GetEnumerator(), который возвращает экземпляр класса/структуры, реализующей следующую сигнатуру (это называется pattern-based foreach):
- Публичное свойство
Current, возвращающее любой тип. - Публичный метод
MoveNext(), возвращающийbool. - Опционально, публичный метод
Dispose()(для правильного освобождения ресурсов при использованииusing).
Примеры встроенных типов, которые можно использовать:
- Массивы (
int[],string[]и т.д.) - Коллекции из пространства имен
System.Collections:ArrayList,Hashtable,Queue,Stack. - Коллекции из пространства имен
System.Collections.Generic:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>. - Строки (
string) - они являются последовательностью символовchar.
Пример пользовательского типа, поддерживающего foreach по шаблону:
// Простой пользовательский тип, поддерживающий foreach
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// Метод GetEnumerator, поддерживающий foreach по шаблону
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// Внутренний класс-перечислитель
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// Свойство Current
public int Current => data[currentIndex];
// Метод MoveNext
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// Метод Dispose (необязательный)
public void Dispose()
{
// Освобождение ресурсов, если необходимо
}
}
}
// Использование в foreach
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }