С новым синтаксисом кортежей С# 7 можно ли указать лямбда с кортежем в качестве параметра и использовать распакованные значения внутри лямбда?
Пример:
var list = new List<(int,int)>();
обычный способ использования кортежа в лямбда:
list.Select(value => value.Item1*2 + value.Item2/2);
Я ожидал появления нового сахара, чтобы избежать .Item1
.Item2
, например:
list.Select((x,y) => x*2 + y/2);
Последняя строка не работает, потому что она рассматривается как два параметра для лямбда. Я не уверен, есть ли способ сделать это на самом деле.
EDIT:
Я попробовал двойной родительский учет в определении лямбда, и он не работал: ((x,y)) => ...
, и, возможно, было глупо пытаться, но двойная скобка действительно работает здесь:
list.Add((1,2));
Кроме того, мой вопрос не совсем о том, чтобы избежать уродливых имен по умолчанию .Item .Item2
, речь идет о фактической распаковке кортежа в лямбда (и, возможно, почему это не реализовано или невозможно). Если вы пришли сюда для решения имен по умолчанию, прочитайте ответ Сергея Березовского.
ИЗМЕНИТЬ 2:
Просто подумал о более общем случае: возможно ли (или почему нет) "деконструировать" кортеж, переданный методу? Вот так:
void Foo((int,int)(x,y)) { x+y; }
Вместо этого:
void Foo((int x,int y) value) { value.x+value.y }