될 것이라고 생각은 했지만 막상 시도해보지 않았던 Steven Giesel님의 두가지 C# 흑마법을 소개합니다.
foreach (var i in 12)
await 2.Seconds()
될 것이라고 생각은 했지만 막상 시도해보지 않았던 Steven Giesel님의 두가지 C# 흑마법을 소개합니다.
foreach (var i in 12)
await 2.Seconds()
응용편입니다. 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
@dimohy 헛 저도 무의식적으로 이렇게 될까? 하고 적어봤었는데 이제 되는군요!!
오 이런 응용 방법도 있었군요…