Может кто-нибудь сказать мне, почему следующий код не работает так, как я ожидаю? Я пытаюсь написать оболочку IEnumberable вокруг StreamReader, но когда я использую ElementAt на нем, он читает последовательные символы из потока независимо от индекса, который я передаю ElementAt. * 1001 *
Файл «test.txt» содержит «abcdefghijklmnopqrstuvwxyz». Я ожидаю, что результат будет:
aaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbb
...
Вместо этого я получаю
АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ
и вызывается ArgumentOutOfRangeException, хотя единственный индекс, который я до сих пор передал ElementAt, равен 0.
MSDN говорит:
Если тип источника реализует IList <(Of <(T>)>), эта реализация используется для получения элемента по указанному индексу. В противном случае этот метод получает указанный элемент.
Должно ли это читать "получает элемент следующий "? Если это так, то это побеждает ленивые списки ...
static IEnumerable<char> StreamOfChars(StreamReader sr)
{
while (!sr.EndOfStream)
yield return (char)sr.Read();
}
static void Main(string[] args)
{
using (StreamReader sr = new StreamReader("test.txt"))
{
IEnumerable<char> iec = StreamOfChars(sr);
for (int i = 0; i < 26; ++i)
{
for (int j = 0; j < 27; ++j)
{
char ch = iec.ElementAt(i);
Console.Write(ch);
}
Console.WriteLine();
}
}
}