Предположим, у меня есть кортежи, скажем List<(string, Table)>
, и я хочу перебрать их, используя Parallel.ForEach
, используя "именованную версию" компонентов кортежей.
Следующий код делает это:
List<(string, Table)> list = new List<(string, Table)>();
Parallel.ForEach(list, tuple =>
{
(string name, Table table) = tuple;
// do stuff with components 'name' and 'table' here
});
Я хочу использовать name
и table
вместо tuple.Item1
и tuple.Item2
соответственно, поскольку это делает код более читабельным.Чтобы это работало, мне пришлось объявить компоненты кортежа внутри ForEach
, если я хотел использовать их «именованные» версии.
МОЙ ВОПРОС:
Существует ли в C # синтаксис, который позволяет нам получить деконструированную версию кортежа, избегая этого объявления внутри тела ForEach's
?
И если такого синтаксиса нет, какмы могли бы достичь этого с помощью методов расширения?
Я имею в виду, что-то вроде этого:
List<(string, Table)> list = new List<(string, Table)>();
Parallel.ForEach(list, (string name, Table table) =>
{
// do stuff with variables 'name' and 'table' here
});
Или, может быть, это?
List<(string, Table)> list = new List<(string, Table)>();
Parallel.ForEach(list, (name, table) =>
{
// do stuff with variables 'name' and 'table' here
});
И, если для этого есть синтаксис, будет ли он применяться и к другим Linq
запросам?
Например,
string[] names = parsed.Select((string name, Table table) => name).ToArray();
Вместо:
string[] names = parsed.Select(t => t.Item1).ToArray();
Это было бы так приятно, особенно при работе с кортежами, содержащими несколько компонентов, например, List<(int, string, int, DateTime, ...)>
.Мы могли бы дать некоторый контекст компонентам кортежей внутри сложных Linq
запросов!