2012-03-01 3 views
3

컬렉션에 List<T> 또는 심지어 클래스 내 arraylist를 사용하는 경우 IEnumerable을 구현하고 열거자를 반환 할 때 자신의 열거 클래스를 만들고 싶습니다. 나는 사람들이 자신의 enumerable 클래스를 만들고 현재, movenext 등을 구현하는 온라인 예제를 볼 수 있습니다 ...자신 만의 IEnumerable 클래스를 만드는 경우

+0

온라인에서 찾은 예제는 C# 지원 이터레이터 블록보다 먼저 작성되었을 수 있습니다. – phoog

답변

7

글쎄, 당신이 컬렉션 클래스를 가지고 있다면 Enumerable이라는 다른 컬렉션을 래핑하지 않고 정확히 할까요.

그렇긴해도 수동으로 열거 형을 정의하는 경우에도 항상 yield 키워드를 사용하는 것을 선호합니다. 현재/이동을 정의하는 사람들의 대부분의 예는 수확량 또는 사용 방법을 알지 못합니다. (나는 정확한 이유에 대해 Current/Move를 정의한 열거 가능한 클래스를 구현했다.)

기본 컬렉션이 오래되었고 IEnumerable<T>이 아니라 단지 IEnumerable을 구현하지 않을 수도있다. 컬렉션이 강력하게 입력 된 경우 열거자를 반환하는 것 이상의 작업을 수행해야합니다 (적어도 .Cast<T>() 호출 일 것입니다).

기본 컬렉션이있는 경우 공개적으로 노출하고 싶지 않은 일부 개인 중첩 클래스 (사용자 정의 키 - 값 쌍일 수도 있음)의 컬렉션 일 수도 있습니다. 기존의 열거자를 전달하는 대신 .Select 호출을 반환해야 할 수도 있습니다 (그러나 실제로는 자신 만의 반복자를 구현할 필요는 없습니다).

0

이러한 예는 사전 제네릭 일 수 있습니까? 제네릭을 사용하지 않는다면 IEnumerable을 구현하고 메서드를 구현해야한다는 것을 알 수 있습니다.

3

파일의 줄을 반복하면서 메모리에 모두로드하지 않으려한다고 가정 해 보겠습니다. 모든 내용을 메모리에로드하는 대신 필요에 따라 다음 줄을 읽는 IEnumerable<string>을 반환 할 수 있습니다. @Servy가 언급 한 것처럼 이런 유형의 상황에 대해 yield을 사용하는 것을 선호합니다.

관련 문제