2012-02-26 5 views
13

이것은 내가클래스를 반복 가능하게 만드는 방법은 무엇입니까?

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity 아래에 반복 가능한 길을 같이 사용하는 클래스를 만들고 싶어 내 수업

public class csWordSimilarity 
{ 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 
} 

입니다 csWordSimilarity 유형입니다. 따라서 모든 공개 int 변수를 반복하고 싶습니다. 위의 방법처럼 iterable을 만들기 위해 csWordSimilarity 클래스를 어떻게 수정해야합니까?

+1

왜 'List '을 사용하지 않는 이유가 있습니까? 그렇다면 IEnumerable 구현을 살펴보십시오. –

+0

"C#"등을 제목에 추가하지 마십시오. 그것이 바로 태그가있는 것입니다. –

+0

참조 : [foreach 루프를 사용자 지정 개체와 함께 사용하는 방법] (http://stackoverflow.com/a/348977/1004522). 이 과정을 거치면 언제든지 사용법을 이해하는 데 도움이됩니다. –

답변

21

당신은 IEnumerable을 구현할 수 있으며, GetEnumerator를 오버라이드가를 사용하여 변수를 통해 "반복자"를 반환해야 : 당신은 너무 같은 List의 내장 반복자를 사용할 수 있습니다 귀하의 경우에는 Using Iterators (C# Programming Guide)

를 참조하십시오 yield 명세서

class csWordSimilarity : IEnumerable<int> 
{ 
    private int _var1 = 1; 
    private int _var2 = 1; 
    private int _var3 = 1; 
    private int _var4 = 1; 

    public IEnumerator<int> GetEnumerator() 
    { 
     yield return _var1; 
     yield return _var2; 
     yield return _var3; 
     yield return _var4; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

답변을 많이 주셔서 감사합니다. "일반적인 유형 'System.Collections.Generic.IEnumerator를 사용하여 오류가 발생했습니다. '1 개의 형식 인수가 필요합니다. " – MonsterMMORPG

+1

사용중인 .NET 버전은 무엇입니까? .NET 4에서 템플릿 형식 정의를 생략 할 수 있으므로 IEnumerable 이 될 수 있으므로이 오류를 복제하는 방법을 생각할 수 없습니다. – edvaldig

8

IEnumerable을 구현하십시오.

using System; 
using System.Collections.Generic; 

class csWordSimilarity : IEnumerable<int> { 
    public int irColumn1 = 0; 
    public int irColumn2 = 0; 
    public int irColumn3 = 0; 
    public int irColumn4 = 0; 
    public int irColumn5 = 0; 

    public IEnumerator<int> GetEnumerator() { 
     return (new List<int>() { 
      irColumn1, irColumn2, irColumn3, irColumn4, irColumn5 
     }).GetEnumerator(); 
    } 
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { 
     return GetEnumerator(); 
    } 
} 
+0

새로운 List 인스턴스를 열거자를 반환하는 유일한 용도로 인스턴스화하는 데 상당한 오버 헤드가 있으며 yield 문은이를 단순화하고 더 적합합니다. – edvaldig

+0

@edvaldig 나는 그것이 선호의 문제라고 생각한다. 이 수백만 번을 부를 것이라면 예, 직접적인 '수익률'을 사용하십시오. 그렇지 않으면 편리한 BCL 클래스와 특히'List'를 선호합니다. –

+0

네, 수백만 번 사용할 것입니다. 에드 발디그를 머리에 주셔서 감사합니다. – MonsterMMORPG

관련 문제