如何实现IEnumerable <T>?

Kyl*_*Ren 1 c#

我一直试图将一个转换type为IEnumerable没有运气.

这是type我想做的IEnumerable.

public class Container<T>
{        
    public int GetInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是获取数据的代码,

Container<String> results = client.GetStuff(query);
Run Code Online (Sandbox Code Playgroud)

所以我试图将变量转换results为IEnumerable<string>,但我不知道如何做到这一点.

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

Tom*_*han 5

为了能够将类型的实例用作IEnumerable<T>,类型必须实现 IEnumerable<T>.您通过: IEnumerable<T>在声明中的类名后添加来表示您要执行此操作:

public class Container<T> : IEnumerable<T>
// ...
Run Code Online (Sandbox Code Playgroud)

当您这样做时,您将收到编译器错误,抱怨您没有实现所有必需的成员.您的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,实现自己的最常用方法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;
}
Run Code Online (Sandbox Code Playgroud)