值元组

Vlaue tuple是轻量级、值类型的元组类型,用于简洁地存储多个不同类型的值


//创建方式1
ValueTuple<int, string> tuple = new ValueTuple<int, string>(1, "张三");
Console.WriteLine(tuple.Item1);
Console.WriteLine(tuple.Item2);
//创建方式2
var Tuple = (1, "张三");
Console.WriteLine(tuple.Item1);
Console.WriteLine(tuple.Item2);
//创建方式3
(int Id, string Name) Tuple = (1, "张三");
 
//创建方式4   
var tuple = (Id: 1, Name: "张三");
Console.WriteLine(tuple.Id);
Console.WriteLine(tuple.Name);

解构值元组

var tuple = (Id: 1, Name: "张三");
    
     //定义变量
     int Id;
     string Name;
     (Id, Name) = user;
  
  
    忽略某个元素(用_)
    var (_,Name) = user;
    Console.WriteLine(Name); 

作为方法返回值(最常用场景)

 public static (bool success,string Message,int Code) Login(string username,string password)
 {
     return (true,"登录成功", 200);
 }

 public void Login(string username,string password,out bool success, string Message, int Code)
 {
     success = true;
     Message = "登陆成功";
     Code = 200;
 }
 

static (bool Success, string Message, int Code) Login(string username, string password)
{
    if (username == "admin" && password == "123456")
    {
        return (Success: true, Message: "登录成功", Code: 200);
    }
    else
    {
        return (Success: false, Message: "用户名或密码错误", Code: 401);
    }
}
 
 
 
 
 
 
调用方法1
    var (isSuccess, msg, code) = Login("admin", "123456");
    Console.WriteLine($"登录结果:{(isSuccess ? "成功" : "失败")},消息:{msg},状态码:{code}");
 
调用方法2
    var loginResult = Login("test", "123");
    Console.WriteLine($"登录失败:{loginResult.Message}({loginResult.Code})");

作为泛型使用

 //初始化字典并且添加初始值
  Dictionary<int,(int a, float b ,string c)> dic = new Dictionary<int, (int a, float b, string c)>() { { 1,(a:11,b:20,c:"字符串") },{ 2,(a:20,b:10,c: "123")}};
  //单独添加元素
  dic.Add(1,(a:11,b:20,c:"字符串"));
  //读取元素
  var tuple1 = dic[1];
  Console.WriteLine(tuple1.a);
  Console.WriteLine(tuple1.b);
  Console.WriteLine(tuple1.c);
 
  foreach (var item in dic)
  {  
 
      //输出元组的值
      Console.WriteLine(item.Value.a);
      Console.WriteLine(item.Value.b);
      Console.WriteLine(item.Value.b);
      //输出Key值
      Console.WriteLine(item.Key);
  }

字典的值可以使用值元组里可以有多个类型的值

主要特性

  • 可变性 (Mutability):与只读的 System.Tuple 不同,值元组的字段是可变的,你可以修改它们的值。
    1var point = (X: 10, Y: 20);
    2point.X = 100; // 允许修改
  • 字段而非属性:值元组的成员(如 Item1Item2)是公共字段,而不是属性。
  • 支持解构:可以方便地将元组的值解构到单独的变量中。
    1var person = ("Alice", 30);
    2var (name, age) = person; // 解构
    3// 现在 name = "Alice", age = 30

关于元素数量的限制

C# 的值元组在底层实现上有一个重要的细节:

  • 8个及以下元素:对于包含1到8个元素的元组,.NET 提供了对应的 ValueTuple<T1>ValueTuple<T1, T2>, ..., ValueTuple<T1, ..., T8> 结构。
  • 超过8个元素:当元组包含超过8个元素时,它会通过嵌套的方式实现。前7个元素作为 Item1 到 Item7,而第8个及之后的所有元素会被打包到另一个 ValueTuple 中,并赋值给 Rest 字段。

这意味着,虽然你可以创建包含任意数量元素的元组,但访问第8个及以后的元素时,语法会变得复杂,需要通过 .Rest 字段来访问。

// 创建一个包含9个元素的元组

var longTuple = (1, 2, 3, 4, 5, 6, 7, 8, 9);

// 访问前7个元素

int first = longTuple.Item1; // 1

// 访问第8个元素

int eighth = longTuple.Rest.Item1; // 8

// 访问第9个元素

int ninth = longTuple.Rest.Item2; // 9

因此,在实际开发中,如果数据结构非常复杂或包含大量字段,通常建议使用类(class)或记录(record)来代替元组,以保证代码的清晰度和可维护性。

更多推荐