在接下来的类(class)中,我成功地实现了 IEnumerable(T) 以循环访问 T。在同一个类(class)中,我能够实现 IEnumerable(DLLItem(T)) 以循环访问 DLLItem(T)。两者都独立工作。这可能是一个基本问题。我应该怎么做才能让两个迭代器在同一个类中一起工作? 我已经尝试了几种总是编译器错误的可能性......
使用 IEnumerable(T)
public class DLL<T> : IEnumerable<T>
{
...
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
...
yield return ...
...
}
...
}
使用 IEnumerable(DLLItem(T))
public class DLL<T> : IEnumerable<DLLItem<T>>
{
...
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<DLLItem<T>> GetEnumerator()
{
...
yield return ...
...
}
...
}
提前感谢您的支持...
@dasblinkenlight 建议的解决方案(见下文)
public class DLLItemEnum<T> : IEnumerable<DLLItem<T>>
{
DLL<T> dll;
public DLLItemEnum(DLL<T> d)
{
dll = d;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<DLLItem<T>> GetEnumerator()
{
...
yield return ...
...
}
public static explicit operator DLLItemEnum<T>(DLL<T> d)
{
DLLItemEnum<T> i = new DLLItemEnum<T>(d);
return i;
}
}
public class ItemEnum<T> : IEnumerable<T>
{
DLL<T> dll;
public ItemEnum(DLL<T> d)
{
dll = d;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
...
yield return ...
...
}
public static explicit operator ItemEnum<T>(DLL<T> d)
{
ItemEnum<T> i = new ItemEnum<T>(d);
return i;
}
public class DLL<T>
{
...
}
class Test
{
static void Main(string[] args)
{
...
foreach (int i in (ItemEnum<int>)z)
Console.WriteLine(i);
foreach (DLLItem<int> i in (DLLItemEnum<int>)z)
Console.WriteLine(i.Data);
...
}
}
最佳答案
可以,但是用起来会很乱。
您必须同时实现 IEnumerable<DLLItem<T>>
和 IEnumerable<T>
接口(interface):
public class DLL<T> : IEnumerable<DLLItem<T>>, IEnumerable<T>
GetNumerator
方法会发生冲突,因此您必须求助于显式接口(interface)实现,这会强制调用者在访问枚举器之前将对象转换为正确的接口(interface)类型:
var dllItems = ((IEnumerable<DLLItem<T>>)someDll);
var Ts = ((IEnumerable<T>)someDll);
我的建议是不要那样做。而是公开一个或两个枚举器的属性。在 Dictionary<TKey, TValue>
中查找示例类(class)。它实现了 IEnumerator<KeyValuePair<TKey, TValue>>
并公开一个 Values
类型属性 IEnumerable<TValue>
和一个 Keys
类型属性 IEnumerable<TKey>
.
关于c# - 在泛型类中实现多个迭代器 - c# - IEnumerable(T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299151/