Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1375. #ЗаметкиНаПолях #Юмор Творим Дичь в C#. Часть 1 В этой короткой серии постов рассмотрим разные странные и зачастую бесполезные вещи, которые можно делать в C#. Начнём с foreach для всего Мы хотим выполнить foreach по целому числу, чтобы получить все его цифры:
foreach (var i in 435972)
{
  Console.WriteLine(i);
}

Конечно, если мы просто так это используем, компилятор ругнётся. Наша задача в том, чтобы это исправить. И это можно легко сделать с помощью методов расширения. Видите ли, foreach не требует от типа реализации интерфейса вроде IEnumerable или IEnumerator. Компилятору нужен всего лишь метод GetEnumerator, возвращающий объект итератора (подробнее про паттерн Итератор), в котором есть свойство Current и метод MoveNext. Давайте добавим его:
public static class Extensions
{
  public static IntEnumerator 
   GetEnumerator(this int i) => new(i);
}

public struct IntEnumerator
{
  private readonly List<int> list;
  private int idx = -1;

  public IntEnumerator(int num)
  {
    list = new List<int>();
    while(num > 0)
    {
      list.Add(num % 10);
      num /= 10;
    }
    list.Reverse();
  }

  public int Current => list[idx];

  public bool MoveNext()
  {
    idx++;
    return list.Count > idx;
  }
}

Ничего сложного. Мы «добавляем» в тип int метод GetEnumerator, который возвращает IntEnumerator. IntEnumerator выполняет требования для цикла foreach. Этот итератор просто помещает отдельные цифры целого числа в список и возвращает их одну за другой по требованию. В результате наш код скомпилируется и выведет:
4
3
5
9
7
2

Источник: https://steven-giesel.com/blogPost/5360d1c3-89f6-4a08-9ee3-6ddbe1b44236