Cursed C# - C#에서 속임수 만들기

될 것이라고 생각은 했지만 막상 시도해보지 않았던 Steven Giesel님의 두가지 C# 흑마법을 소개합니다.

  • foreach (var i in 12)
  • await 2.Seconds()

3개의 좋아요

응용편입니다. C# 11에서는 이제 INumber로 숫자 타입을 식별할 수 있으므로 다음과 같이 제네릭으로 확장 메소드를 만들 수 있습니다.

using System.Numerics;


// int 순환
foreach (var n in 10)
{
    Console.WriteLine(n);
}

Console.WriteLine();

// double 순환
foreach (var n in 3d)
{
    Console.WriteLine(n.GetType().Name);
    Console.WriteLine(n);
}

Console.WriteLine();

foreach (var n in (1..10).Range(2))
{
    Console.WriteLine(n);
}

Console.WriteLine();

foreach (var n in 1d.To(10d, 2d))
{
    Console.WriteLine(n.GetType().Name);
    Console.WriteLine(n);
}



static class EnumerableExtensions
{
    public static IEnumerator<TValue> GetEnumerator<TValue>(this TValue value)
        where TValue : INumber<TValue>
    {
        for (TValue i = TValue.Zero; i < value; i++)
            yield return i;
    }

    public static IEnumerable<int> Range(this Range @this, int step = 1)
    {
        for (var i = @this.Start.Value; i < @this.End.Value; i += step)
            yield return i;
    }

    public static IEnumerable<TValue> To<TValue>(this TValue from, TValue to, TValue step)
        where TValue : INumber<TValue>
    {
        for (TValue i = from; i < to; i += step)
            yield return i;
    }
}

| 결과

0
1
2
3
4
5
6
7
8
9

Double
0
Double
1
Double
2

1
3
5
7
9

Double
1
Double
3
Double
5
Double
7
Double
9
3개의 좋아요

@dimohy 헛 저도 무의식적으로 이렇게 될까? 하고 적어봤었는데 이제 되는군요!!

:smile:

2개의 좋아요

오 이런 응용 방법도 있었군요…

2개의 좋아요