свой пример LINQ - совместимой коллекции

Видимо, у меня не очень умный вопрос...

Я пытаюсь лучше понять LINQ, на котором "пишут структурированные запросы к локальным коллекциям".

Ок. С коллекциями типа

    string[] myNumbers = { "one", "two", "three" };

всё понятно. Хочу поэкспериментировать со своей коллекцией!

Прочитал, что "а LINQ можно запрашивать любую коллекцию, реализующую интерфейс IEnumerable".

Беру пример с Метанита и... у меня есть класс, у этого класса есть GetEnumerator(), но LINQ- метод .ToList() я у него вызвать не могу.

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    namespace TryIenu
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] myNumbers = { "one", "two", "three" };
                // в следующей строке Linq работает
                List<string> tmp1 = myNumbers.ToList();

                Week w = new();
                // а здесь - не работает
                List<string> tmp2 = w.ToList();
            }
        }

        class Week : IEnumerable{
            string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday",
                                "Friday", "Saturday", "Sunday" };
            public IEnumerator GetEnumerator()
            {
                return new WeekEnumerator(days);
            }
        }

        class WeekEnumerator : IEnumerator{
            string[] days;
            int pozition = -1;
            public WeekEnumerator(string[] days) => this.days = days;

            public object Current{
                get{
                    if (pozition<=-1 || pozition>days.Length)
                        throw new ArgumentException();
                    return days[pozition];
                }
            }

            public bool MoveNext(){
                if (pozition<days.Length-1){
                    pozition++;
                    return true;
                }
                return false;
            }

            public void Reset() => pozition = -1;
        }
    }

я понимаю, что я ошибаюсь в чём то очевидном. Возможно, просто смотрю не в тот пример. Как бы мне исправить этот пример, или посоветуйте мне какой то пример собственной реализации LINQ - совместимой коллекции?

Мне в комментариях написали, что нужно реализовывать IEnumerable<T>, и GetEnumerator<T>.

Я реализовал, но код приобрел загадочность, которой раньше в нём не было.

Например, если раньше в коде было просто

    public object Current{get{...}};

то теперь есть два метода:

    public string Current{get{...}}

и

    object IEnumerator.Current{get{...}}

причем ни один из этих методов убрать нельзя, и модификатор public - ни убрать, ни добавить нельзя.

я не понимаю, почему реализовать IEnumerator<string> настолько сложнее, чем просто IEnumerator

Если можно - подскажите? может, я всё таки где то ошибся?

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;

    namespace TryIenu
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] myNumbers = { "one", "two", "three" };
                // в следующей строке Linq работает
                List<string> tmp1 = myNumbers.ToList();

                Week w = new();
                // теперь и здесь - работает!
                List<string> tmp2 = w.ToList();
            }
        }

        class Week : IEnumerable<string>{
            string[] days = { "Monday", "Tuesday", "Wednesday", "Thursday",
                                "Friday", "Saturday", "Sunday" };
            IEnumerator<string> IEnumerable<string>.GetEnumerator()
            {
                return new WeekEnumerator(days);
            }

            public IEnumerator GetEnumerator()
            {
                throw new NotImplementedException();
            }
        }

        class WeekEnumerator : IEnumerator<string>{
            string[] days;
            int pozition = -1;
            public WeekEnumerator(string[] days) => this.days = days;

            public string Current{
                get{
                    if (pozition<=-1 || pozition>days.Length)
                        throw new ArgumentException();
                    return days[pozition];
                }
            }

            object IEnumerator.Current {
                get{
                    if (pozition<=-1 || pozition>days.Length)
                        throw new ArgumentException();
                    return days[pozition];
                }
            }
            
            public void Dispose() {}

            public bool MoveNext(){
                if (pozition<days.Length-1){
                    pozition++;
                    return true;
                }
                return false;
            }

            public void Reset() => pozition = -1;
        }

Ответы (0 шт):