c# - 在泛型类中实现多个迭代器 - c# - IEnumerable(T)

标签 c# generics

在接下来的类(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/

相关文章:

c# - 是否有通用的 CollectionViewSource 替代方案?

java - 泛型 - 无法添加到具有无限通配符的列表

c# - 如何转换为通用集合

c# - SQL 存储过程未返回小数位

c# - 从 API 中检索 JSON 到 C#

c# - 在引发事件的方法上编写代码契约

c# - 如何使用通用搜索获取实体列表

c# - 在 .NET 中添加斜杠/转义单引号

c# - 如何遍历正在修改的列表?

Java泛型的误解