次のコードが期待どおりに機能しない理由を誰かに教えてもらえますか?StreamReaderの周りにIEnumberableラッパーを書き込もうとしていますが、ElementAtを使用すると、ElementAtに渡すインデックスに関係なく、ストリームから連続した文字が読み取られます。
ファイル「test.txt」には「abcdefghijklmnopqrstuvwxyz」が含まれています。出力は次のようになると思います。
aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbb ..。
_
代わりに私は得る
abcdefghijklmnopqrstuvwxyz
これまでにElementAtに渡したインデックスは0だけですが、ArgumentOutOfRangeExceptionが呼び出されます。
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();
}
}
}