[C#] foreach에 Range 사용하기

이게 얼마나 실용적인가는 잘 모르겠지만, 어쨌든 C#에서도 확장메서드를 간단히 만들면 다음의 코드가 정상 동작 합니다.

foreach (var i in 1..1000)    // CS1579, `Range`에 `GetEnumerator()`정의가 없어 오류
{
    Console.WriteLine(i); 
}

다음의 코드를 추가,


static class RangeExtension
{
    public static IEnumerator<int> GetEnumerator(this Range @this)
    {
        for (var i = @this.Start.Value; i < @this.End.Value; i++)
        {
            yield return i;
        }
    }
}

이후 정상 컴파일 되고 잘 동작합니다.

  1. foreach 대상은 확장메소드로 GetEnumerator()를 구현해도 수용합니다!
  2. foreach (var i in 1..1000)이런 표현은… 어떠신가요?
4개의 좋아요

나쁘진 않은 의견이라고 생각합니다.
문득 찾아보니 System.Range (1..100 등과 같은)와 Enumerable.Range가 아예 다른 친구였네요!
기존 걸 재사용 해도 되지 않았을까 하는 생각도 살짝 들었습니다.

3개의 좋아요

네 사실, Range는 범위를 순회하는 목적이 아니라(맞다면 MS에서 순회가능하도록 메소드를 추가해줬겠죠) 범위 자체를 의미하는거라… 위 코드가 이뻐보이긴 하는데 step을 표현할 수 없다는 큰 단점이 있습니다.

3개의 좋아요

맞는말씀이십니다.
둘다 Range라서 처음에 엄청 헷갈렸어요 @_@
foreach 에 한해서라도 허용해주면 참 괜찮을 듯싶기도 하네요.

2개의 좋아요