문제

다음 수업을 가정하십시오.

public class MyEnum: IEnumerator
{
    private List<SomeObject> _myList = new List<SomeObject>();
...
}

MyEenum에서 ienumerator 방법을 구현해야합니다. 그러나 ienumerator 메소드를 구현할 필요없이 ienumerator의 구현을 _mylist로 직접 '위임'하거나 리디렉션 할 수 있습니까?

도움이 되었습니까?

해결책

방법 1 :캡슐화 및 목록 구현으로의 전진 호출을 계속 사용하십시오.

class SomeObject
{
}

class MyEnum : IEnumerable<SomeObject>
{
    private List<SomeObject> _myList = new List<SomeObject>();

    public void Add(SomeObject o)
    {
        _myList.Add(o);
    }

    public IEnumerator<SomeObject> GetEnumerator()
    {
        return _myList.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyEnum a = new MyEnum();
        a.Add(new SomeObject());

        foreach (SomeObject o in a)
        {
            Console.WriteLine(o.GetType().ToString());
        }

        Console.ReadLine();
    }
}

방법 2 :목록 구현에서 상속 해당 동작을 무료로 얻습니다.

class SomeObject
{
}

class MyEnum : List<SomeObject>
{
}

class Program
{
    static void Main(string[] args)
    {
        MyEnum a = new MyEnum();
        a.Add(new SomeObject());

        foreach (SomeObject o in a)
        {
            Console.WriteLine(o.GetType().ToString());
        }

        Console.ReadLine();
    }
}

방법 1 MyEnum 지식없이 목록에서 호출되는 방법이 없으므로 더 나은 샌드 박스를 허용합니다. 최소한의 노력 방법 2 선호됩니다.

다른 팁

당신은 이것을 할 수 있습니다 :

public class MyEnum : IEnumerator {
    private List<SomeObject> _myList = new List<SomeObject>();
    public IEnumerator GetEnumerator() { return this._myList.GetEnumerator(); }
}

그 이유는 간단합니다. 클래스에는 컬렉션 인 여러 필드가 포함될 수 있으므로 컴파일러/Enviroment는 "ienumerator"를 구현하는 데 어떤 필드를 사용해야하는지 알 수 없습니다.

EIDT : @PB에 동의합니다. IENUMERATOR를 구현해야합니다u003CSomeObject> 상호 작용.

PB의 방법을 사용하는 것 외에도 "간단한"이유는 불가능합니다. 인터페이스 방법은 전달되어야합니다. this 첫 번째 인수로서의 포인터. 전화 할 때 GetEnumerator 당신의 대상에서,이 포인터는 당신의 대상이 될 것입니다. 그러나 호출이 중첩 된 목록에서 작동하기 위해서는 포인터가 수업이 아니라 해당 목록에 대한 참조가되어야합니다.

따라서 방법을 다른 객체에 위임해야합니다.

(그건 그렇고, 다른 답변의 조언은 옳았습니다. IEnumerator<T>, ~ 아니다 IEnumerable!)

발신자가 컬렉션을 수정할 수없는 방식으로 컬렉션을 반환하려면 목록을 readOnlyCollection <>로 닫고 readOnlyCollection <>의 ienumerable <>를 반환 할 수 있습니다.

이렇게하면 컬렉션이 변경되지 않을 수 있습니다.

목록에서 파생되지 않는 한u003CT> .

public class MyEnum : List<SomeObject>, IEnumerable<SomeObject>{}

귀하의 의견과 설명에 감사드립니다. 결국 나는 당신의 답을 다음과 결합했습니다.

    class MyEnum : IEnumerable<SomeObject>
{
    private List<SomeObject> _myList = new List<SomeObject>();
    public IEnumerator<SomeObject> GetEnumerator()
    {
        // Create a read-only copy of the list.
        ReadOnlyCollection<CustomDevice> items = new ReadOnlyCollection<CustomDevice>(_myList);
        return items.GetEnumerator();
    }
}

이 솔루션은 호출 코드가 목록을 수정할 수 없도록하는 것이며 각 열거자는 모든면에서 다른 열거 자와 독립적입니다 (예 : 정렬). 다시 한 번 감사드립니다.

감사합니다 오리 타자, 당신이 사용할 수있는 foreach a GetEnumerator 방법 - 객체 유형이 실제로 구현할 필요는 없습니다 IEnumerable.

그래서 당신이 이것을한다면 :

class SomeObject
{
}

 class MyEnum
 {
    private List<SomeObject> _myList = new List<SomeObject>();

    public IEnumerator<SomeObject> GetEnumerator()
    {
        return _myList.GetEnumerator();
    }
 }

그런 다음 이것은 잘 작동합니다.

MyEnum objects = new MyEnum();
// ... add some objects
foreach (SomeObject obj in objects)
{
    Console.WriteLine(obj.ToString());
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top