свой пример 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;
}