是否有一些类似于扩展元素的合并元组的语法?

chu*_*ill 2 c#

从 C#12 开始,该语言支持Collection 表达式,它允许使用扩展元素合并集合。

我的问题是,元组是否有一些类似的语法,特别是组合元组?(见下面的例子)

using System;

// Collection expression
int[] arr1 = [1, 2];
int[] arr2 = [3, 4];
int[] arr3 = [..arr1, ..arr2]; // combine using spread element => [1, 2, 3, 4]

// tuples, similar syntax
var tpl1 = (1, 2); 
var tpl2 = (3, 4);

// Sadly this doesn't work? 
var tpl3 = (..tpl1, ..tpl2); // Cannot implicitly convert type '(int, int)' to 'System.Index'
Run Code Online (Sandbox Code Playgroud)

我知道,我可以这样做:

var tpl3b = (tpl1.Item1, tpl1.Item2, tpl2.Item1, tpl2.Item2); 
Run Code Online (Sandbox Code Playgroud)

但对于较大的元组或名称较长的元组来说并不方便。

Gur*_*ron 6

不存在现成的这样的运算符。如果您有很多类似上述代码的代码,您可以“编写”一段代码。通过手动定义一堆扩展方法:

\n
public static class ValutTupleExts\n{\n    public static (T1, T2, T3, T4) Combine<T1, T2, T3, T4>(this (T1, T2) t1, (T3, T4) t2) =>\n        (t1.Item1, t1.Item2, t2.Item1, t2.Item2);\n    // many-many variants of the code above\n}\n
Run Code Online (Sandbox Code Playgroud)\n

和用法:

\n
var tpl3 = tpl1.Combine(tpl2); // tpl3 is (int, int, int, int)\n
Run Code Online (Sandbox Code Playgroud)\n

或者可以通过使用源生成器(即编写将生成上述方法的代码)来增强此方法,这样您就不需要手动完成。

\n

笔记:

\n
    \n
  • 来自“在类和结构之间进行选择”文档:

    \n
    \n

    \xe2\x9d\x8c 避免定义结构,除非该类型具有以下所有特征:

    \n
      \n
    • ...
    • \n
    • 它的实例大小小于 16 字节。
    • \n
    • ...
    • \n
    \n
    \n

    虽然框架中定义的不同ValueTuple\ 已经违反了此建议,但我仍然建议在处理大值元组时牢记这一点,并尽量避免使用具有超过 2-4 个元素的元组。

    \n
  • \n
  • 超过 7 个元素的值元组实际上是包含嵌套值元组的值元组(编译器在很多情况下都会为您处理,但仍然如此) - ValueTuple<T1,T2,T3,T4,T5,T6,T7,TRest>

    \n
    public struct ValueTuple<T1,T2,T3,T4,T5,T6,T7,TRest> : IComparable, IComparable<(T1, T2, T3, T4, T5, T6, T7, TRest)>, IEquatable<(T1, T2, T3, T4, T5, T6, T7, TRest)>, System.Collections.IStructuralComparable, System.Collections.IStructuralEquatable, ITuple where TRest : struct\n
    Run Code Online (Sandbox Code Playgroud)\n

    (1,2,3,4,5,6,7,8)实际上是ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>>

    \n
  • \n
  • 如果您认为此功能应该成为该语言的一部分 - 考虑在csharplang存储库 @github 中建议它。

    \n
  • \n
\n