C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Linq 直積のクエリ式とメソッド形式の変換


(過去ログ 111 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65851 / inTopicNo.1)   Linq 直積のクエリ式とメソッド形式の変換
  
□投稿者/ poti (1回)-(2013/03/20(Wed) 21:12:53)

分類:[C#] 

C#4です。

Linqを学習中です。

参考書に次のクエリ式とメソッド形式の変換の例がありました。

【クエリ式1】
from x in Enumerable.Range(1, 9)
from y in Enumerable.Range(1, 9)
select x + " * " + y + " = " + (x * y).ToString();

【メソッド形式1】
var query = Enumerable.Range(1, 9)
.SelectMany((y)=>Enumerable.Range(1, 9), (x, y) =>x+" * "+y+" = "+ x * y);

さらに1〜9の配列?も加えた3つのものの直積を求めたいと思います。
SelectManyを入れ子にして【メソッド形式2】のようには出来たのですが、
さらに数が増えた時に困るので他に良い方法はありますか。

また、【クエリ式3】をメソッド形式に変えるにはどのようにしたらよいですか?

【クエリ式2】
from x in Enumerable.Range(1, 9)
from y in Enumerable.Range(1, 9)
from z in Enumerable.Range(1, 9)
select x * y * z;

【メソッド形式2】
Enumerable.Range(1, 9)
.SelectMany((x) => Enumerable.Range(1, 9)
.SelectMany((y) => Enumerable.Range(1, 9), (a, b) =>a*b)
,(x, y) =>x*y);

【クエリ式3】
from x in Enumerable.Range(1, 9)
from y in Enumerable.Range(1, 9)
from z in Enumerable.Range(1, 9)
select x + " * " + y + " * " + z + " = " + (x * y * z).ToString();

【メソッド形式3】
???

宜しくお願いします。
引用返信 編集キー/
■65853 / inTopicNo.2)  Re[1]: Linq 直積のクエリ式とメソッド形式の変換
□投稿者/ Hongliang (47回)-(2013/03/20(Wed) 22:15:12)
2013/03/20(Wed) 22:16:28 編集(投稿者)
匿名クラスを使用します。

> 【クエリ式3】
> from x in Enumerable.Range(1, 9)
> from y in Enumerable.Range(1, 9)
> from z in Enumerable.Range(1, 9)
> select x + " * " + y + " * " + z + " = " + (x * y * z).ToString();

【メソッド形式3】
Enumerable.Range(1, 9)
.SelectMany(_ => Enumerable.Range(1, 9), (x, y) => new { x, y })
.SelectMany(_ => Enumerable.Range(1, 9), (a, z) =>  String.Format("{0} * {1} * {2} = {3}", a.x, a.y, z, a.x * a.y * z))

引用返信 編集キー/
■65854 / inTopicNo.3)  Re[2]: Linq 直積のクエリ式とメソッド形式の変換
□投稿者/ poti (3回)-(2013/03/20(Wed) 22:28:35)
理解できました。
ありがとうございました。
解決済み
引用返信 編集キー/
■65855 / inTopicNo.4)  Re[1]: Linq 直積のクエリ式とメソッド形式の変換
□投稿者/ shu (231回)-(2013/03/20(Wed) 22:30:30)
No65851 (poti さん) に返信

var qry = Enumerable.Range(1, 9)
.SelectMany(x => Enumerable.Range(1, 9), (x, y) => new { x, y })
.SelectMany(xy => Enumerable.Range(1, 9), (xy, z) => xy.x + " * " + xy.y + " * " + z + " = " + (xy.x * xy.y * z));

こんな感じになりますね。

>【メソッド形式1】
> var query = Enumerable.Range(1, 9)
> .SelectMany((y)=>Enumerable.Range(1, 9), (x, y) =>x+" * "+y+" = "+ x * y);
参考書の通りだとすると(y)の表記は(x)の方がわかりやすいですね。結果は求めるものと一致しますが
もとのLINQ式のxが該当するのは先頭行の1〜9にあたります。Enumerableの範囲を変えてみるとわかりやすいかと思います。

引用返信 編集キー/
■65857 / inTopicNo.5)  Re[2]: Linq 直積のクエリ式とメソッド形式の変換
□投稿者/ shu (233回)-(2013/03/20(Wed) 22:38:46)
No65855 (shu さん) に返信

Hongliangさんとかぶってしまいました。
異なる部分だけ参考にしてみてください。
引用返信 編集キー/
■65858 / inTopicNo.6)  Re[3]: Linq 直積のクエリ式とメソッド形式の変換
□投稿者/ poti (4回)-(2013/03/20(Wed) 22:49:10)
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -