C# 7 是否允许在 linq 表达式中解构元组

Does C# 7 allow to deconstruct tuples in linq expressions

提问人:Random 提问时间:12/1/2016 最后编辑:Patrick McDonaldRandom 更新时间:9/9/2022 访问量:7772

问:

我正在尝试解构 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 = Convert(word)
             select result.Original

是否有适当的方法来解构它,或者 Linq 表达式中是否不支持它?

C LINQ 元组 C#-7.0

评论

0赞 Cory Nelson 12/1/2016
不幸的是,LINQ 集成在 C# 7 中没有经过深思熟虑。

答:

28赞 Patrick McDonald 12/1/2016 #1

似乎不是。

GitHub 上有一个悬而未决的问题:https://github.com/dotnet/roslyn/issues/6877

编辑

问题已移至 dotnet/csharplang#355

评论

1赞 svick 12/1/2016
事实上,它不能与当前的 Roslyn 母版一起编译
2赞 Random 12/1/2016
谢谢。可悲的是,它仍然处于积压状态
4赞 Bolpat 4/30/2022
在 2022 年,我们不能使用 or .from (x, y) in pointslet (x, y) = point
9赞 Julien Couvreur 3/12/2017 #2

C# 7.0 不支持 Linq 查询中的解构。

C# 7.0 中只有三种形式的解构(赋值解构、“foreach”循环和“for”循环解构)。 但是,当语言设计委员会考虑了所有可能声明变量的地方(因此将成为解构的候选者)并确定它们的优先级时,“let”(可能还有“from”)子句中的解构是紧随其后的。

如果您觉得这有用,请务必在 https://github.com/dotnet/csharplang/issues/189 上留下便条或竖起大拇指。

2赞 Nuno Dias 9/30/2020 #3

你可以做这样的事情:

public static (string Original, string Translation) Convert(string word)
{
    return ("Hello", "Hello translated");
}
static void Main(string[] args)
{
    List<string> words = new List<string>();
    words.Add("Hello");

    var result = from word in words
                    select Convert(word).Translation;

    Console.WriteLine("Hello, world!" + result.FirstOrDefault());
}