Как получить именованные компоненты кортежа внутри запросов Linq? - PullRequest
0 голосов
/ 24 сентября 2018

Предположим, у меня есть кортежи, скажем 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 запросов!

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Мне кажется, что вы хотите что-то подобное?

string[] names = parsed.Cast<(string name, Table table)>().Select(p => p.name).ToArray();
0 голосов
/ 24 сентября 2018

Как получить «именованные» компоненты кортежа в запросах Linq?

Самое простое решение - дать вашим элементам имя, например,

List<(string Name, Table Table)> list = new List<(string, Table)>();
// or simply
var list = new List<(string Name, Table Table)>();

Parallel.ForEach(list, t => 
{
    // do something with t.Name, t.Table
    var name = t.Name;
    var table = t.Table;
});

Есть ли в C # синтаксис, который позволяет нам получить деконструированную версию .. внутри ForEach

Афаик №.

...