web-dev-qa-db-ja.com

selectステートメントでの名前付きタプルの使用

Varターゲット変数を使用してC#7で名前付きタプルを選択するより良い方法はありますか?例1で何か間違ったことをしているのか、何かを完全に誤解しているのでしょう。これを行うには、ターゲットタイプを明示的に設定する必要があるようです。

//1. Fails to compile with "incorrect number of type parameters" issue.
var tuples = source.Select<(int A, int B)>(x => (x.A, x.B));

//2. Compiles
IEnumerable<(int A, int B)> tuples = toCheck.Select(x => (x.A, x.B));

//3. Compiles
var tuples = new HashSet<(int A, int B)>(source.Select(x => (x.A, x.B)));
16
gmn

varだけを使用できますが、Tuple要素に実際に名前が付けられていることを確認する必要があります。

C#7.0では、これを明示的に行う必要があります。

var tuples = source.Select(x => (A: x.A, B: x.B));
foreach (var Tuple in tuples)
{
    Console.WriteLine($"{Tuple.A} / {Tuple.B}");
}

C#7.1では、タプルリテラルの値がプロパティまたはフィールドから取得されると、その識別子が暗黙的に要素名になるため、次のように記述できます。

var tuples = source.Select(x => (x.A, x.B));
foreach (var Tuple in tuples)
{
    Console.WriteLine($"{Tuple.A} / {Tuple.B}");
}

互換性などの詳細については 機能ドキュメント を参照してください。

20
Jon Skeet