如何在 Linq 查询中获取“命名”元组组件?

sɐu*_*qɐp 2 c# linq lambda tuples c#-7.3

假设我有一个元组,List<(string, Table)>我想使用 a 迭代它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
});
Run Code Online (Sandbox Code Playgroud)

我想分别使用nameandtable而不是tuple.Item1and 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
});
Run Code Online (Sandbox Code Playgroud)

或者这个?

List<(string, Table)> list = new List<(string, Table)>();
Parallel.ForEach(list, (name, table) => 
{
    // do stuff with variables 'name' and 'table' here
});
Run Code Online (Sandbox Code Playgroud)


而且,如果有这样的语法,它是否也适用于其他Linq查询?

例如

string[] names = parsed.Select((string name, Table table) => name).ToArray();
Run Code Online (Sandbox Code Playgroud)

代替:

string[] names = parsed.Select(t => t.Item1).ToArray();
Run Code Online (Sandbox Code Playgroud)


这真是太好了,尤其是在处理包含多个组件的元组时,例如List<(int, string, int, DateTime, ...)>. 我们将能够为复杂Linq查询中的元组组件提供一些上下文!

Chr*_*jen 5

如何在 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;
});
Run Code Online (Sandbox Code Playgroud)

C# 中是否有语法允许我们在 ForEach 中获取解构版本 ..

Afaik 没有。

  • @AlexandruClonțea - 问题是,使用 t.Item1 很难理解里面的内容。分解元组是解决此问题的一种选择。所以,它是“我们可以简化分解吗?” - 正如你和我以及其他人所写:不。还有另一种方法可以解决“真正的问题”吗?是的。问题和答案中都提到了两者。 (2认同)