你能在C# 7中行内命名Tuple项吗?

6

默认情况下,使用C# 7元组时,项目将被命名为Item1Item2等。

我知道你可以为返回的元组项命名。但是你能否在内联代码中做到同样的事情,例如以下示例?

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

foreach 的主体中,我希望能够使用比 Item1Item2 更好的方法来访问其中包含 ab 的元组。
2个回答

17

可以的,通过解构元组:

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
这太棒了,我已经阅读了多篇关于C# 7元组的文章,但在任何地方都没有看到冒号语法的文档记录。 - Gigi
@Gigi,你可能在这些文章的“解构”部分中已经做到了。只要有一个Deconstruct成员或扩展方法,任何类型都可以用这种方式进行解构。元组非常适合这种情况。你可以为现在没有它们的类型创建扩展解构方法,例如KeyValuePair只需要一个void Deconstruct<TK,TV>(this KeyValuePair,out TK key, out TV value) ...方法。 - Panagiotis Kanavos
可以在此处找到使用新元组语法与 refoutref local 的示例用法:[https://dev59.com/36Lia4cB1Zd3GeqPj3_-#46019408] - Glenn Slayden

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接