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