当前位置: 首页 > news >正文

C#高级用法:元组

1.开发环境

  • Visual Studio 2017 及更高版本:从 Visual Studio 2017 开始,支持 C# 7.0 及更高版本的特性,包括元组。在 Visual Studio 2017 版本 15.3 及更高版本中,可以使用显式元组名称。

  • .NET Framework 4.7 及更高版本:元组功能需要 System.ValueTuple 类型,这些类型在 .NET Framework 4.7 及更高版本中可用。如果项目面向的是 .NET Framework 4.6.2 或更早版本,则需要通过 NuGet 包管理器添加 System.ValueTuple 包。

2.自定义元组

      // 创建一个自定义元组var person = (Id: 1, Name: "Alice", Age: 30);// 访问元组的属性MessageBox.Show($"Id: {person.Id}, Name: {person.Name}, Age: {person.Age}");//结果:Id: 1, Name: Alice, Age: 30//自定义(string, int) x = ("aaa", 99);MessageBox.Show($"姓名:{x.Item1},年龄:{x.Item2}");//结果:姓名:aaa,年龄:99

3.使用场景

在 C# 中,元组(Tuple)是一种非常灵活且强大的数据结构,它可以用来存储多个不同类型的数据。以下是元组的常见使用场景:

3.1 返回多个值

在函数中,元组可以用来返回多个值,而无需定义复杂的类或结构体。例如,一个函数可以同时返回计算结果和错误信息:

public (int sum, int count) CalculateSumAndCount(int[] numbers)
{int sum = 0;int count = numbers.Length;foreach (int number in numbers){sum += number;}return (sum, count);
}var result = CalculateSumAndCount(new int[] { 1, 2, 3, 4, 5 });
MessageBox.Show($"Sum: {result.sum}, Count: {result.count}");

运行结果:Sum: 15, Count: 5

3.2传递多个参数

元组也可以用来传递多个参数,避免定义过多的参数或使用匿名类型。例如,可以将多个参数封装到一个元组中,然后传递给方法:

public void ProcessData((string name, int age) data)
{MessageBox.Show($"Name: {data.name}, Age: {data.age}");
}ProcessData(("Alice", 30));

运行结果:Name: Alice, Age: 30

3.3作为字典的键

元组可以用作字典的键,从而实现多键字典。例如,可以使用元组作为键来存储用户信息:

var userDictionary = new Dictionary<(string name, int age), string>
{{ ("Alice", 30), "Developer" },{ ("Bob", 25), "Designer" }
};string job = userDictionary[("Alice", 30)];MessageBox.Show(job); // 输出:Developer

运行结果:Developer

3.4 简化数据结构

元组可以用来简化数据结构,避免定义过多的类或结构体。例如,可以使用元组来表示一个点的坐标:

var point = (x: 10, y: 20);
MessageBox.Show($"Point: ({point.x}, {point.y})");

运行结果:Point: (10, 20)

3.5 临时数据存储

在某些情况下,元组可以用作临时数据存储,例如在循环中存储中间结果:

            // 创建一个匿名类型的列表var someCollection = new List<dynamic>{new { Id = 1, Name = "Alice" },new { Id = 2, Name = "Bob" },new { Id = 3, Name = "Charlie" }};// 创建结果列表var results = new List<(int id, string name)>();// 遍历 someCollection 并添加到 resultsforeach (var item in someCollection){results.Add((item.Id, item.Name));}// 输出结果foreach (var result in results){                textBox1.Text += ($"Id: {result.id}, Name: {result.name};");}

运行结果:Id: 1, Name: Alice;Id: 2, Name: Bob;Id: 3, Name: Charlie;

3.6 与 LINQ 结合使用

元组可以与 LINQ 查询结合使用,方便地处理多个字段。例如,可以对一个集合进行分组并返回多个字段:

 var people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 30 }};var groupedByAge = people.GroupBy(p => p.Age).Select(g => (Age: g.Key, Count: g.Count(), Names: string.Join(", ", g.Select(p => p.Name))));foreach (var group in groupedByAge){           textBox1.Text += $"Age: {group.Age}, Count: {group.Count}, Names: {group.Names};";}public class Person {public string Name { get; set; }public int Age { get; set; }}

运行结果:Age: 30, Count: 2, Names: Alice, Charlie;Age: 25, Count: 1, Names: Bob;

http://www.dtcms.com/a/335219.html

相关文章:

  • pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  • docker安装mongodb及java连接实战
  • 视频理解综述
  • 【异步】js中异步的实现方式 async await /Promise / Generator
  • 码上爬第十一题【协程+wasm】
  • 博弈论07——Lemke-Howson 算法
  • STM32-GPIO实践部分1-跑马灯实验
  • 【Java基础面试题】Java基础概念
  • 按键及消抖
  • C++ 最短路Dijkstra
  • [Python]PTA:for 求奇数分之一序列前N项和
  • 安卓开发选择题
  • CUDA 编程笔记:CUDA延迟隐藏
  • 通配符 重定向 管道符
  • Java 中重载与重写的全面解析(更新版)
  • 在浏览器端使用 xml2js 遇到的报错及解决方法
  • BM25算法和传统的TF-IDF算法的区别
  • 改进版的QGIS 的(属性查询) identify featrues 功能
  • 算法题Day2
  • 计组-间接寻址
  • 抽象代数 · 代数结构 | 群、环、域、向量空间
  • 【QT】常⽤控件详解(八) Qt窗⼝ 菜单栏 工具栏 状态栏 浮动窗口 五种内置对话框
  • Oracle数据库文件管理与空间问题解决指南
  • Java中 23 种设计模式介绍,附带示例
  • IO流-打印流
  • leetcode hot100数组:缺失的第一个正数
  • 洛谷B3924 [GESP202312 二级] 小杨的H字矩阵
  • 洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵(举一反三)
  • CSDN部分内容改为视频转到B站-清单
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘opencv-python’问题