GetEnumerator (). Current дает мне исключение при вызове в основной функции - PullRequest
0 голосов
/ 24 сентября 2019

Я исправил класс Vector.пожалуйста, смотрите код ниже.Вне моей основной функции у меня есть функция ниже.Мне не разрешено изменять эту функцию.

private static bool CheckIntSequence<T>(T[] certificate, Vector<T> vector)
    {
        if (certificate.Length != vector.Count) return false;
        int counter = 0;
        foreach (T value in vector)
        {
            if (!value.Equals(certificate[counter])) return false;
            counter++;
        }
        return true;
    }

в основной функции я создал объект векторного класса и добавил элементы в следующей последовательности (2, 6, 8, 5, 5, 1, 8,5, 3, 5, 7, 1, 4, 9) с использованием метода vector.Add (2).Теперь, когда я вызываю функцию CheckIntSequence через исключение, потому что длина вектора равна 15. this is the data array in vector object

    Console.WriteLine("\nTest D: Check the content of the Vector<int> by traversing it via 'foreach' statement ");
            if (!CheckIntSequence(new int[] { 2, 6, 8, 5, 5, 1, 8, 5, 3, 5, 7, 1, 4, 9 }, vector)) throw new Exception("The 'foreach' statement produces an incorrect sequence of integers");
            Console.WriteLine(" :: SUCCESS");

, как я уже упоминал, я могу вносить изменения только в векторный класс.Я пробовал несколько вещей, чтобы добиться успеха в CheckIntSequence, но не повезло.Может кто-то, пожалуйста, посмотрите и помогите мне, что я делаю неправильно в моем векторном классе.

public class Vector<T> : IEnumerable<T>
{
    private const int DEFAULT_CAPACITY = 10;        
    private T[] data;
    public int Count = 0;
    public int Capacity
    {  get { return data.Length; } }

    public Vector(int capacity)
    {  data = new T[capacity]; }

    public Vector() : this(DEFAULT_CAPACITY) { }

    public T this[int index]
    {   get
        {
            if (index >= Count || index < 0) throw new IndexOutOfRangeException();
            return data[index];
        }
        set
        {
            if (index >= Count || index < 0) throw new IndexOutOfRangeException();
            data[index] = value;
        }
    }

    public int IndexOf(T element)
    {
        for (var i = 0; i < Count; i++)
        {
            if (data[i].Equals(element)) return i;
        }
        return -1;
    }

    private void ExtendData(int extraCapacity)
    {
        T[] newData = new T[Capacity + extraCapacity];
        for (int i = 0; i < Count; i++) newData[i] = data[i];
        data = newData;
    }
    public void Add(T element)
    {
        if (Count == Capacity) ExtendData(DEFAULT_CAPACITY);
        data[Count++] = element;
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new VectorEnumerator(data);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public class VectorEnumerator : IEnumerator<T>
    {
        private T[] _data;
        private int curIndex;
        private T current;

        public VectorEnumerator(T[] list)
        {          
            _data = list;
            curIndex = -1;
            current = default(T);
        }

        public bool MoveNext()
        {
            if (++curIndex >= _data.Length)
            {   return false; }
            else
            {   current = _data[curIndex]; }
            return true;
        }

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

        void IDisposable.Dispose() { }

        public T Current {get { return current; }}

        object IEnumerator.Current {get { return Current; }}            
    }
}

1 Ответ

2 голосов
/ 24 сентября 2019

Как указано здесь https://docs.microsoft.com/en-us/dotnet/api/system.collections.ienumerable.getenumerator?view=netframework-4.8, "Первоначально перечислитель располагается перед первым элементом в коллекции."Вам необходимо вызвать MoveNext (), чтобы установить текущую позицию для первого элемента.

...