R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

LINQ 病ですか?

foreach(DataRow dr in rows) {
  DataSet.HogeHogeRow r = (DataSet.HogeHogeRow)x;
  if (r.Id > 0) this.HogeHogeMethod(r.Id);
}


こんな記述を見つけては・・・


var q =
  from DataSet.HogeHogeRow x in rows
  where x.Id > 0
  select(x.Id);
foreach(var id in q) this.HogeHogeMethod(id);


こんな風に書き直したい衝動に駆られる俺ガイルー

我慢しろ俺!

しかもコードが長くなっているジャマイカ!


(from DataSet.HogeHogeRow x in rows where x.Id > 0 select(x.Id)).ForEach(id => this.HogeHogeMethod(id));


こうやって書けるといいのに、と思ったら NyaRuRu さんが、こんなコードを提示していた。

http://blogs.wankuma.com/naka/archive/2007/06/03/79237.aspx

なるほど!

しかし、よくこんな方法を思いつくなぁ・・・ってことで書き直す(僕のスタイルと違うのでw)


static class Extensions {
  public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
    foreach (T x in source) action(x);
  }
}


おかげさまで、最終的には以下のコードになりました。


var q = from DataSet.HogeHogeRow x in rows where x.Id > 0 select(x.Id);
q.ForEach(id => this.HogeHogeMethod(id));


結局、書き直してしまった orz

投稿日時 : 2007年12月6日 13:14

Feedback

# re: LINQ 病ですか? 2007/12/06 13:18 かるあ

ソースの中に埋め込みのクエリ式がいきなり出てくると驚きません?
オブジェクトに対する LINQ はステートメントで呼び出すほうが多いなー

って、Rさんのところってすでに3.5導入済み!?

# re: LINQ 病ですか? 2007/12/06 15:18 Streetw☆

NyaRuRuさんのコメントの続きみたいに
var q = from DataSet.HogeHogeRow x in rows where x.Id > 0 select x.Id;
Array.ForEach(q.ToArray(), id => this.HogeHogeMethod(id));
とすると拡張メソッドを作らなくても良さそうですね。

というか、やっぱり
var q = from DataSet.HogeHogeRow x in rows where x.Id > 0 select x.Id;
foreach(var id in q) this.HogeHogeMethod(id);
の方がわかりやすくないですか。。?
改行すると長くなるけど、それはRさんの最終コードも同じかなって思いますしw

でも私も負けないくらい病気ですw
var q = from DataSet.HogeHogeRow x in rows where x.Id > 0 select x.Id;
q.Select(id => { this.HogeHogeMethod(id); return 0; }).ToArray();
とか真っ先に試しました。。

# re: LINQ 病ですか? 2007/12/10 13:48 R・田中一郎

かるあ さん

>ソースの中に埋め込みのクエリ式がいきなり出てくると驚きません?

それ以前に LINQ という機能自身にリアルに驚いてますが。

>って、Rさんのところってすでに3.5導入済み!?

いえいえ、導入してませんよ。
勝手にいじり倒しているだけです。

----------------------------------
Streetw☆ さん

>Array.ForEach(q.ToArray(), id => this.HogeHogeMethod(id));

うーん、この書き方も試してみたんですが、Array.ForEach するためにオブジェクトを配列として出力しなければならないのってどうなのかなー、と思ったのです。

>foreach(var id in q) this.HogeHogeMethod(id);
>の方がわかりやすくないですか。。?

わかりやすいと思います^^;

>とか真っ先に試しました。。

同志よ(T-T)

タイトル
名前
Url
コメント