从C#12开始,该语言支持Collection expressions,这允许使用扩散元素合并集合.

我的问题是,有没有some simliar syntax for tuples,特别是合并元组?(见下面的例子)

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'

我知道,我可以这么做:

var tpl3b = (tpl1.Item1, tpl1.Item2, tpl2.Item1, tpl2.Item2); 

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

推荐答案

没有这样的开箱即用的运营商.如果您有很多这样的代码,您可以"编写"一个.通过定义一组扩展方法手动执行以下操作:

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

使用方法:

var tpl3 = tpl1.Combine(tpl2); // tpl3 is (int, int, int, int)

或者可以通过使用source generators来增强这种方法(即编写将生成上述方法的代码),因此您不需要手动完成.

备注:

  • 来自Choosing Between Class and Struct个文档:

    ❌除非类型具有以下所有特征,否则应避免定义 struct :

    • ...
    • 它的实例大小小于16个字节.
    • ...

    虽然框架中定义的不同ValueTuple‘S已经违反了这一建议,但我仍然建议在使用大值元组时记住这一点,并尽量避免使用元素超过2-4的元组.

  • 具有7个以上元素的值元组实际上是包含嵌套的值元组的值元组(编译器在许多情况下会为您处理这一点,但仍会)-ValueTuple<T1,T2,T3,T4,T5,T6,T7,TRest>:

    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
    

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

  • 如果你认为这个功能应该是语言的一部分--考虑在csharplangrepo@gihub中建议它.

Csharp相关问答推荐

MongoDB将JS查询转换为C#的问题

什么是通过反射创建类的泛型接口方法的正确方法?

使用Audit.EntityFramework,我如何将外键的值设置为相关实体上的属性?

XUNIT是否使用测试数据的源生成器?

如何在Parall.ForEachAsync中使用CancerationTokenSource

如何注册类使用多级继承与接口

如何在C#中将方法/线程启动传递给基本构造函数

当我没有此令牌时,为什么语法报告EOF错误?

RabbitMQ群集的MassTransit配置问题

等待一个等待函数

升级后发出SWITCH语句

如何从Entity Framework Core中填充ListIInterface

Blazor Server/.NET 8/在初始加载时调用异步代码是否冻结屏幕,直到第一次异步调用完成?

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

映射器-如何映射到多个实体

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

我可以阻止类型上的Object.ToString()吗?

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

XmlSerializer在遇到XML属性(命名空间)时崩溃