R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

独り言

http://builder.japan.zdnet.com/member/u518773/blog/2009/02/25/entry_27020655/
LINQ練習 #1 「LINQ to Object 基本」より

このサンプルコードを

素直に LINQ にする

と以下になると思うんだけどなー


var q =
  from i in Enumerable.Range(0, 365 + 1)
  where DateTime.Today.AddDays(i).DayOfWeek == DayOfWeek.Sunday
  select DateTime.Today.AddDays(i);
foreach (var x in q) Console.WriteLine(x.ToShortDateString());


AddDays(i) メソッドは低負荷ではあるけど、実行を 1 回にまとめるために、最初に日付を得ておく方が良い気がする。
そうすると LINQ 使用前のコードも以下のようにした方が良い気がする。


for (int i = 0; i <= 365; i++){
  DateTime d = DateTime.Today.AddDays(i);
  if (d.DayOfWeek == DayOfWeek.Sunday) {
    Console.WriteLine(d.ToShortDateString());
  }
}


で、このサンプルコードを素直に LINQ にすると以下になるかな。


var q =
  from i in Enumerable.Range(0, 365 + 1)
  let d = DateTime.Today.AddDays(i)
  where d.DayOfWeek == DayOfWeek.Sunday
  select d;
foreach (var x in q) Console.WriteLine(x.ToShortDateString());


でも僕が同じ要件に当たったら、リンク先のコメントのように from を二重にする書き方が好みだな。

投稿日時 : 2009年3月25日 14:48

Feedback

# re: 独り言 2009/03/26 9:48 trapemiya

>でも僕が同じ要件に当たったら、リンク先のコメントのように from を二重にする書き方が好みだな。

SQLに慣れている人だとそう思いそうですね。でも、やっぱりLINQらしいのはletを使っている一番最後のでしょう。LINQ to ObjectのObjectらしさが出てますもの。

# re: 独り言 2009/03/26 11:56 R・田中一郎

不思議と let を使った例を見ない理由でもあるのかも知れませんね。

# re: 独り言 2009/03/26 12:12 NyaRuRu

なんかこれだと列挙中に今日の日付が変わったら変なことになりそうな.

Today は固定した方がいいんじゃないですかね.

var seq = Enumerable.Repeat(DateTime.Today, 365 + 1)
          .Select((today, i) => today.AddDays(i))
          .Where(d => d.DayOfWeek == DayOfWeek.Sunday);

# re: 独り言 2009/03/27 13:38 R・田中一郎

確かに^^;
そんなことより Repeat を上手く使った例を初めて見ました。

# re: 独り言 2009/03/27 14:38 biac

最初の日曜日を見つけたら、その後は AddDays(7) したいなぁ~
…って思っちゃうのはケチですか? (w

# re: 独り言 2009/03/27 15:12 R・田中一郎

それは触れずに置きたかった訳ですがw

そもそも、題材としては、日付じゃなくてコレクションオブジェクトがある状態からスタートしないと、伝えたいことがボヤけてしまうと思う訳です。

タイトル
名前
Url
コメント