使用新的C# 7元组语法,是否可以指定一个以元组作为参数的lambda,并在lambda内部使用展开的值?
示例:
使用新的C#7元组语法,能否在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的答案。
编辑2:
刚想到一个更一般的用例:是否可以将传递给方法的元组“解构”? 像这样:
void Foo((int,int)(x,y)) { x+y; }
改为这样:
void Foo((int x,int y) value) { value.x+value.y }
Enumerable.Select
的参数是一个Func<TSource, TResult>
委托。它接受 TSource 类型的单个参数,您无法更改它。 - Sergey Berezovskiylist.Select(t => { (int x, int y) = t; return x * 2 + y / 2 });
,但此时我认为你正在失去元组语法相对于上面的替代方案的简洁性。 - Peter Duniho