下記のようなfrom文を複数用いた場合のメソッド構文の書き方はどのようになるのでしょうか?
cs
1 var v = ( 2 from y in new[] { 0, 1 } 3 from x in new[] { 0, 1 } 4 select new IntInt(x, y)).ToArray();
以下のような書き方で同じ結果を取得することができましたが、もっと上手な方法がありましたら教えていただきたいです。
よろしくお願いいたします。
cs
1 var v = new[] { 0, 1 } 2 .SelectMany(y => new[] { 0, 1 } 3 .Select(x => new IntInt(x, y))).ToArray(); 4
cs
1 public struct IntInt 2 { 3 public int x; 4 public int y; 5 public IntInt(int x,int y) 6 { 7 this.x = x; 8 this.y = y; 9 } 10 }
追記、補足
質問に至った経緯:上記のクエリ文を見て、「メソッド構文ならどう書くのか」と疑問を持ったためです。
あまり深い理由はなく、一般的にはどのように書くのかが知りたいため質問いたしました。
.Net Framework 4.7.1となります。
何をする目的でそういうことがしたいのかによって話が結構違ってくると思います。実用的&具体的な例を書けませんか?
開発環境を書いてください。Visual Studio のバージョン、.NET か Core どっちかとそのバージョンなど。
ご助言ありがとうございます。補足の方を追記させいただきました。
「もっと上手な方法」というのは思いつかないです。強いて言えば、Linq 本体の話ではないですが、IntInt を構造体+フィールドではなくてクラス+プロパティにするぐらいです。
public class IntInt
{
public int X { get; set; }
public int Y { get; set; }
}
質問のコードはコンパイラによって SelectMany に書き換えられます。現状のメソッド構文でどうするかということであれば、SelectMany を使うのが最適でしょう。
しかし、拡張メソッドは自分で追加できます。引数の数を型の整合性を保ちながら可変にするためにはたくさんのオーバーロードを書かなければいけませんが、T4 テンプレートエンジンや C# のコードジェネレーターを使えば、次のようなメソッドを実装できます。(標準ライブラリにはありません)
SelectMany(new[] { 0, 1 }, new[] { 0, 1 }, (x, y) => { X = x, Y = y })
SelectManyを使うと長ったらしくなるので拡張メソッドを書くことも一考の余地がありそうですね。
ありがとうございました!
回答1件
あなたの回答
tips
プレビュー