你可以内联命名C#7元组项吗?

时间:2017-04-27 09:05:58

标签: c# tuples c#-7.0

默认情况下,使用C#7元组时,项目的名称将为Item1Item2,依此类推。

我知道你可以name tuple items being returned by a method。但是,您可以使用相同的内联代码,例如以下示例吗?

foreach (var item in list1.Zip(list2, (a, b) => (a, b)))
{
    // ...
}

foreach的正文中,我希望能够使用比a更好的内容访问末尾的元组(包含bItem1)和Item2

2 个答案:

答案 0 :(得分:12)

是的,你可以通过解构元组:

foreach (var (boo,foo) in list1.Zip(list2, (a, b) => (a, b)))
{
    //...
    Console.WriteLine($"{boo} {foo}");
}

foreach (var item in list1.Zip(list2, (a, b) => (a, b)))
{
    //...
    var (boo,foo)=item;
    Console.WriteLine($"{boo} {foo}");
}

即使您在声明元组时命名了字段,也需要使用解构语法将它们作为变量访问:

foreach (var (boo,foo) in list1.Zip(list2, (a, b) => (boo:a, foo:b)))
{
    Console.WriteLine($"{boo} {foo}");
}

如果要在不解构元组的情况下按名称访问字段,则必须在创建元组时为其命名:

foreach (var item in list1.Zip(list2, (a, b) => (boo:a, foo:b)))
{
    Console.WriteLine($"{item.boo} {item.foo}");
}

答案 1 :(得分:3)

请注意,C#7.1将在元组名称上添加细化。不仅可以显式命名元组元素(使用名称冒号语法),而且可以推断它们的名称。这类似于匿名类型中成员名称的推断。

例如,var t = (a, this.b, y.c, d: 4); // t.a, t.b, t.c and t.d exist

有关详细信息,请参阅https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/infer-tuple-names.md