web-dev-qa-db-ja.com

C#7ではlinq式のタプルを分解できますか

Linq式内のタプルを分解しようとしています

// somewhere inside another method
var result = from Word in words
             let (original, translation) = Convert(Word)
             select original

タプルを返すメソッドのシグネチャは次のとおりです

(string Original, string Translation) Convert(DictionaryWord Word)
{
    // implementation
}

しかし、それは有効な構文ではありません。分解せずにタプル値にのみアクセスできます。

var result = from Word in words
             let result = GetWord(Word, mode)
             select result.Original

それを分解する適切な方法はありますか、それともLinq式内でサポートされていませんか?

28
Random

そうではないようです。

これにはGitHubに未解決の問題があります: https://github.com/dotnet/roslyn/issues/6877

編集

問題は dotnet/csharplang#355 に移動しました

17

Linqクエリでの分解は、C#7.0ではサポートされていません。

3つの形式の分解のみがC#7.0になりました(割り当て、「foreach」ループ、および「for」ループでの分解)。しかし、言語設計委員会が変数を宣言する可能性のあるすべての場所を検討し(したがって、脱構築の候補となる)、それらに優先順位を付けたとき、「let」(および場合によっては「from」)句の脱構築が次に並んでいました。

これが役立つと思われる場合は、必ずメモまたは親指を立てて https://github.com/dotnet/csharplang/issues/189 に残してください。

5
Julien Couvreur