我该如何实现IEnumerator <T>?

Mar*_*mes 2 c# generics

此代码未编译,它抛出以下错误:

'TestesInterfaces.MyCollection'类型已包含'Current'的定义

但是当我删除模糊方法时,它会不断给出其他错误.

有人可以帮忙吗?

public class MyCollection<T> : IEnumerator<T>
{
    private T[] vector = new T[1000];
    private int actualIndex;

    public void Add(T elemento)
    {
        this.vector[vector.Length] = elemento;
    }

    public bool MoveNext()
    {
        actualIndex++;
        return (vector.Length > actualIndex);
    }

    public void Reset()
    {
        actualIndex = -1;
    }

    void IDisposable.Dispose() { }

    public Object Current
    {
        get
        {
            return Current;
        }
    }


    public T Current
    {
        get
        {
            try
            {
                T element = vector[actualIndex];
                return element;
            }
            catch (IndexOutOfRangeException e)
            {
                throw new InvalidOperationException(e.Message);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Syn*_*der 9

您需要定义当前正在实现的接口.

Object IEnumerator.Current
{
    //
}

public T Current
{
    //
}
Run Code Online (Sandbox Code Playgroud)

这样你的类有2个Current属性.但你可以访问它们.

MyCollection<string> col = new MyCollection<string>();
var ienumeratort = col.Current; //Uses IEnumerator<T>
var ienumerator = (IEnumerator)col.Current; //uses IEnumerator
Run Code Online (Sandbox Code Playgroud)

  • 更典型的是将strong-typed属性设置为public,并且仅对`object`-type属性使用显式接口实现. (5认同)

Mic*_*ter 8

我想你是误会IEnumerator<T>.通常,集合实现IEnumerable<T>,而不是IEnumerator<T>.你可以这样想:

  • 当一个类实现时IEnumerable<T>,它声明"我是可以枚举的东西的集合".
  • 当一个类实现时IEnumerator<T>,它表示"我是一个枚举某事的东西."

实现集合很少(也可能是错误的)IEnumerator<T>.通过这样做,您将集合限制为单个枚举.如果您尝试在已经循环遍历集合的代码段中循环遍历集合,或者如果您尝试同时在多个线程上遍历集合,则无法执行此操作,因为您的集合本身正在存储枚举操作的状态.通常,集合(实现IEnumerable<T>)返回单独的对象(实现IEnumerator<T>),并且单独的对象负责存储枚举操作的状态.因此,您可以拥有任意数量的并发或嵌套枚举,因为每个枚举操作都由不同的对象表示.

另外,为了使foreach语句起作用,in关键字后面的对象必须实现IEnumerableIEnumerable<T>.如果对象仅实现IEnumerator或,它将无法工作IEnumerator<T>.

我相信这是您正在寻找的代码:

public class MyCollection<T> : IEnumerable<T>
{
    private T[] vector = new T[1000];
    private int count;

    public void Add(T elemento)
    {
        this.vector[count++] = elemento;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return vector.Take(count).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)