gpt4 book ai didi

C# 7 元组和 lambda

转载 作者:太空狗 更新时间:2023-10-29 23:49:22 25 4
gpt4 key购买 nike

使用新的 C# 7 元组语法,是否可以指定一个以元组作为参数的 lambda 并在 lambda 中使用未打包的值?

例子:

var list = new List<(int,int)>();

在 lambda 中使用元组的正常方法:

list.Select(value => value.Item1*2 + value.Item2/2);

我期待一些新的糖来避免 .Item1 .Item2,比如:

list.Select((x,y) => x*2 + y/2);

最后一行不起作用,因为它被视为 lambda 的两个参数。我不确定实际上是否有办法做到这一点。

编辑:

我在 lambda 定义中尝试了双括号但它不起作用:((x,y)) => ...,也许尝试是愚蠢的,但双括号确实有效这里:

list.Add((1,2));

另外,我的问题不完全是关于避免难看的默认名称 .Item .Item2,而是关于在 lambda 中实际解包一个元组(以及为什么它没有实现或不可能)。如果您是来这里寻找默认名称的解决方案,请阅读 Sergey Berezovskiy's answer .

编辑 2:

只是想到一个更一般的用例:是否有可能(或为什么不)“解构”传递给方法的元组?像这样:

void Foo((int,int)(x,y)) { x+y; }

取而代之的是:

void Foo((int x,int y) value) { value.x+value.y }

最佳答案

正如您所观察到的,对于:

var list = new List<(int,int)>();

人们至少希望能够做到以下几点:

list.Select((x,y) => x*2 + y/2);

但 C# 7 编译器(目前)还不支持这一点。期望允许以下情况的糖也是合理的:

void Foo(int x, int y) => ...

Foo(list[0]);

编译器将 Foo(list[0]); 自动转换为 Foo(list[0].Item1, list[0].Item2);

目前这些都不可能。然而,这个问题,Proposal: Tuple deconstruction in lambda argument list ,存在于 GitHub 上的 dotnet/csharplang 存储库中,要求语言团队在未来的 C# 版本中考虑这些功能。如果您也希望看到对此的支持,请将您的声音添加到该线程。

关于C# 7 元组和 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48576328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com