中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

LINQってのはね。

var ABC = new[] {
              new { id = 10, name = "naka", sex = "1" },
              new { id = 20, name = "carbo", sex = "9"},
              new { id = 30, name = "umebayashi", sex = "1"},
              new { id = 40, name = "naoko", sex = "2"},
              new { id = 50, name = "episteme", sex = "1"},
          };

var 結果 = from x in ABC
         where x.sex == "1"
         select x;
foreach (var xx in 結果)
{
    Console.WriteLine(xx.id + "\t" + xx.name + "\t" + xx.sex);
}
Console.ReadLine();

この、ABC, 結果, xxそれぞれ違う型だけど、推論してくれてるのがポイント。

ABCはAnonymousType<int, string, string>[]のようなもの。

結果はIEnumerable<int, string, string>のようなもの

xxはAnonymousType<int, string, string>のようなもの

じっさいにはちょっとマジックなものが入ってそうですが。

下の方のforeachを実はこう書きたい。

foreach (var xx in 結果)
{
    Console.WriteLine(xx.id + "\t" + xx.name + "\t" + xx.sex);
}

Array.ForEach<typeof(結果)>(結果, xx => Console.WriteLine(xx.name));

でも残念ながらこれはできない。結果がtypeofできないから。うーん微妙に不便。

投稿日時 : 2007年6月3日 8:54

コメントを追加

# re: LINQってのはね。 2007/06/03 10:38 NyaRuRu

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

// 中略

結果.ForEach(xx => Console.WriteLine(xx.name));
Console.ReadLine();

まあこういう時のために System.Unit 型があると便利なんですが.(ECMA TR/89)

# re: LINQってのはね。 2007/06/03 14:25 NyaRuRu

>結果がtypeofできないから。

"結果"が配列じゃないから.

C# 2.0 でサポートしている型推論の段階で,この場面での typeof は不要なような.

Array.ForEach(結果.ToArray(), xx => Console.WriteLine(xx.name));

# re: LINQってのはね。 2007/06/03 14:29 NyaRuRu

というか typeof が返すのは Type クラスのインスタンスなので,どっちにしろ typeof 関係ないか.

# re: LINQってのはね。 2007/06/03 14:42 中博俊

まぁ試行錯誤の結果(^^;;

# re: LINQってのはね。 2007/06/03 15:09 NyaRuRu

//別解1
Array.ForEach((from x2 in 結果 select x2.name).ToArray(), Console.WriteLine);

//別解2 (先ほどの Util.ForEach を定義した上で)
(from x2 in 結果 select x2.name).ForEach(Console.WriteLine);

なんかいくらでも解がありますな.

# re: LINQってのはね。 2007/06/03 23:29 中博俊

なるほどなるほど。
確かにいけますね。
ToArray()が肝ですね。

# re: 暗に型を設ける 2007/06/20 21:04 R.Tanaka.Ichiro's Blog

re: 暗に型を設ける

# LINQ 病ですか? 2007/12/06 13:14 R.Tanaka.Ichiro's Blog

LINQ 病ですか?

タイトル
名前
URL
コメント