プロが教える店舗&オフィスのセキュリティ対策術

StreamReader sr = new StringReader(filePath);
foreach (Strins s in sr.ReadLine())
{
}
上記プログラムでは
型'char'を'string'に変換できません。
と出てきて無理でした。

http://stackoverflow.com/questions/286533/filest …
此方を参考に、下記プログラムを書きました。

private static IEnumerable<string> ReadLine()
{
string str;
while ((str = sr.ReadLine()) != null)
{
yield return str;
}
}
private static void loop()
{
foreach (string str in ReadLine())
{

}
}

1. 下記のものは動くのですが、なぜ最初に書いたものではダメなのでしょうか?
2. もっと綺麗(スリム)に書くことはできないでしょうか?
3.
string str;
while ((str = sr.ReadLine()) != null)

while((string str = sr.ReadLine()) != null)
とするとエラーが出るのはなぜでしょうか?

宜しくお願いします。

A 回答 (2件)

1. 逆に,なぜダメではないと思ったのでしょうか。


StreamReader.ReadLineの戻り値,foreachの機能から,エラーであることは容易に想像がつきますが。

2. using + whileループが通常一番の書き方です。
TextReaderをIEnumerable<string>によく変換するのであれば,拡張メソッド作るのもよいでしょうが。

3. 宣言は式ではないからです。
    • good
    • 0
この回答へのお礼

ありがとうございました。
最近foreachに興味をもち、
forやwhileをみるとforeachに書き換えたい気持ちをおさえられなくて><

実用では無理にforeachを利用せずにusing+whileで書いた方がよさそうですね。

お礼日時:2012/04/29 16:12

1. StreamReader.ReadLineは配列型を返さないから。


2. 普通はEndOfStreamで判断してReadLineするwhileループで、わざわざ反復子を定義してまでforeach使う理由はないんじゃないかなぁ。
3. #1でも言われてますが宣言文は式じゃないので、式のように代入結果を参照することはできません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!