如何实现IEnumerable <t>?

时间:2017-11-18 12:31:47

标签: c#

我一直试图将type转换为IEnumerable而没有运气。

这是type我想要IEnumerable

public class Container<T>
{        
    public int GetInt { get; set; }
}

这是获取数据的代码

Container<String> results = client.GetStuff(query);

所以我尝试将变量results转换为IEnumerable<string>,但我不知道如何执行此操作。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

为了能够将类型的实例用作IEnumerable<T>,该类型必须实现 IEnumerable<T>。您在声明中的类名后添加: IEnumerable<T>表示您要这样做:

public class Container<T> : IEnumerable<T>
// ...

当你这样做时,你会收到编译错误,抱怨你还没有实现所有必需的成员。您的IDE应该能够为它们自动生成存根,但这是您必须要做的:

public class Container<T> : IEnumerable<T>
{
    // forward the non-generic version to the generic version
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    // implement GetEnumerator from the generic interface
    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

现在,实现自己的IEnumerable<T>的最常用方法是包装内置的一个,例如一个List<T>或一个数组。如果这就是你正在做的事情,你可以将GetEnumerator()调用转发给内部实例并完成。

如果你想做更复杂的事情,你可以例如使用yield return构造构建迭代协议:

public IEnumerator<T> GetEnumerator()
{
    // do some work
    // then return the first element:
    yield return default(T); // yeah, you probably have an actual value

    // do some more work
    // return another value:
    yield return default(T);

    // if you want to abort the iteration prematurely
    // e.g. based on some condition
    // you can
    yield break;
}

答案 1 :(得分:1)

results的类型属于Container<String>,并且Container通用类已定义,您无法将其投射到IEnumerable<string>。如果您愿意,您应声明Container<T>实现此接口并提供实现。

public class Container<T> : IEnumerable<T>
{
    // provide an implementation of the missing members.
}