문제

사용자 정의 열거를 사용하는 실시간 예제를 이해하기 위해 다른 웹 사이트를 방문한 후이 라인을 삭제하고 있습니다. 나는 예제가있다. 그러나 그들은 나를 혼란스럽게 만듭니다.

예시

1을 가져 가라

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

2를 가져 가라

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

기본

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

Take 2에서는 사용자 정의 반복을 따라 Take 1에서 한 것과 동일한 정수 배열을 반복합니다. 맞춤 반복을 사용하여 정수를 반복하기 위해 덤불에 대해 이길?

아마 내가 놓친 것 같아요 실시간 사용자 정의 반복 필요. 기존 반복 시설에서 할 수없는 과제를 설명해 주시겠습니까? (방금 학교를 마쳤으므로 간단한 예를 들어 올리 이해할 수 있도록 간단한 예를 들어주세요.).

업데이트 : 나는 어떤 사이트에서 그 예를 가져 왔습니다. 그 코드에는 특별한 것이 없습니다. 우리는 사용자 정의 반복을 사용하지 않아도 간단하게 달성 할 수 있습니다. 내 관심은 사용자 정의 반복이 매우 편리한 실제 시나리오를 아는 것이 었습니다.

도움이 되었습니까?

해결책

맞춤형 반복자는 반복중인 리소스가 메모리에서 사전로드되지 않고 각 반복에 필요에 따라 얻을 때 유용합니다. 예를 들어 LINQ에서 SQL에서 다음과 같은 작업을 수행 할 때

foreach(var employee in dataContext.Employees) {
    // Process employee
}

각 단계에서 foreach 루프, 데이터베이스의 직원 테이블은 다음 레코드를 얻기 위해 쿼리됩니다. 이렇게하면 루프를 일찍 나가면 전체 테이블을 읽지 않았지만 필요한 레코드 만 읽지 못했습니다.

실제 예를 보려면 여기를 참조하십시오. 파일의 줄을 열거합니다. 여기에서 각 줄은 각 반복의 파일에서 읽습니다. foreach 고리. (부수적으로 .NET Framework 4는 이와 동일한 기능을 내장합니다).

다른 팁

솔직히 말해서, 나는 당신이 요구하는 것을 완전히 확신하지 못하지만, 배열을 반환하는 것 (테이크 1에서와 같이)과 반복자를 반환하는 것 (테이크 2)의 차이에 대해 걱정한다면 여기 내 대답이 있습니다.

배열을 반환하는 것과 반복자를 반환하는 것에는 큰 차이가 있습니다. 배열을 반환한다는 것은 내부 상태를 반환하는 것을 의미합니다 (반품의 일부로 사본을 만들지 않지만 비용이 많이 듭니다). 반복자를 반환하면 추상화를 반환하면 발신자가 반복 상태가됩니다. 이것은 또한 필요한 경우 게으른 평가를 할 수 있음을 의미합니다 (배열을 반환하는 경우 분명히 할 수없는 일).

또한 C# 2의 반복자에 대한 지원으로 손으로 ienumerable을 구현할 이유가 없습니다. 자세한 내용은이 질문을 참조하십시오 누군가가 수율 키워드를 탈신 할 수 있습니까?

과거에 맞춤 반복이 나에게 유용한 또 다른 예가 트리 구조에서 모든 노드를 재귀 적으로 열거하기 위해 공통적 인 추상화를 제공하는 것이 었습니다.

foreach (Node n in tree)
  //...do something
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top