while文をforeachに変換する
LINQ信者たるもの、あの処理もこの処理も全部LINQで書きたい!
のですが、たまに古いソースでwhile文でデータソースの
中身を列挙する処理などを見るとなんとなくイヤ〜な気持ちになります。
ありがちな物としてはCSVからオブジェクトを作る処理とか。
こんなの。
public static void Main()
{
var fs = new FileStream("test.csv", FileMode.Open, FileAccess.Read);
var sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
var item = new Item(line);
// 何か処理
}
sr.Close();
fs.Close();
}
このwhile文を滅ぼしたくて、以下のようなクラスを作って見ました。
IterUtil.cs
public static class IterUtil
{
public static IEnumerable<T> Iterate<T>(Func<bool> isEnded, Func<T> getItem)
{
if (isEnded())
yield return getItem();
}
}
これを使えば、こう書けます。
public static void Main()
{
var fs = new FileStream("test.csv", FileMode.Open, FileAccess.Read);
var sr = new StreamReader(fs, Encoding.GetEncoding("SHIFT_JIS"));
foreach (Item item in IterUtil.Iterate(() => sr.EndOfStream, () => new Item(sr.ReadLine())))
{
// 何か処理
}
sr.Close();
fs.Close();
}
いやまあ別にちゃんと動いてるならwhile文のままでいいだろって話もあるのですが、
やっぱりLINQ&foreachの方が「列挙してる」って感じで好きなのです。
Author And Source
この問題について(while文をforeachに変換する), 我々は、より多くの情報をここで見つけました https://qiita.com/koba-a-koba/items/5694b7b3f1895a819aec著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .