문제
다음 수업을 가정하십시오.
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());
}