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

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

4 ответа

Решение

Как получить именованные компоненты кортежа внутри запросов 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

Афаик нет.

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

string[] names = parsed.Cast<(string name, Table table)>().Select(p => p.name).ToArray();

Вы должны использовать: вместо =

var k = executeResultSet.Select(s => new
{
    IDUser = (int) s["IDUser"],
    SourceCode = s["SourceCode"],
    SourceSystem = s["SourceSystem"]
}).ToList();

var k = executeResultSet.Select(s => 
(
    IDUser: (int) s["IDUser"],
    SourceCode: s["SourceCode"],
    SourceSystem: s["SourceSystem"]
)).ToList();

Не совсем то, что вы хотите, но это альтернатива ответу Кристофа:

      List<(string, Table)> list = new List<(string, Table)>();
Parallel.ForEach(list, ((string name, Table table) t) => 
{
    // do stuff with variables 't.name' and 't.table' here
});
Другие вопросы по тегам