【发布时间】:2009-03-28 08:31:34
【问题描述】:
谁能告诉我为什么下面的代码不能按我预期的方式工作?我正在尝试围绕 StreamReader 编写一个 IEnumberable 包装器,但是当我在其上使用 ElementAt 时,无论我传递给 ElementAt 的索引如何,它都会从流中读取顺序字符。
文件“test.txt”包含“abcdefghijklmnopqrstuvwxyz”。我希望输出是:
呸呸呸呸呸呸呸呸呸
bbbbbbbbbbbbbbbbbbbbbbbbbbbbb
...
我得到了
abcdefghijklmnopqrstuvwxyz
并且 ArgumentOutOfRangeException 被调用,尽管到目前为止我传递给 ElementAt 的唯一索引是 0。
MSDN 说:
如果源的类型实现了 IList)>),则该实现用于获取指定索引处的元素。否则,此方法获取指定元素。
应该读作“获得下一个元素”吗?如果是这样,那有点违背惰性列表的目的......
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();
}
}
}
【问题讨论】:
标签: c# linq streamreader