匿名类型与元组(ValueTuple)

news2024/10/5 16:29:06

匿名类型与元组(ValueTuple)

匿名类型

简介:匿名类型提供了一种方便的方法,可用来将一组相关的属性封装到单个对象中。匿名对象由编译器在编译时动态生成,它是只读的,且只在当前作用域中可见。它可以方便地在代码中传递和
我的:不用写class直接new对象,组合数据,传递数据
好处:避免编写不必要的类,提高编码效率,逻辑更清晰
缺点:超出当前作用域,需使用dynamic或反射等方式来获取数据项
应用:匿名对象通常用在LINQ的select字句及多返回值场景
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace demo匿名类型
{
    internal class Person
    {
        public string  Name { get; set; }//姓名
        public string  Sex { get; set; }//性别
        public int Age { get; set; }//年龄
    }

    public class Student
    {
        public int Id { get; set; }//学生编号
        public string Name { get; set; }//学生姓名
        public int Age { get; set; }//学生年龄
        public string Gender { get; set; }//学生性别
        public int ClassId { get; set; }//所在班级编号
    }

    public class Class
    {
        public int Id { get; set; }//班级编号
        public string ClassName { get; set; }//班级名称
        public string Teacher { get; set; }//班级教师
    }
}

using System.Reflection;
namespace demo匿名类型
{
    internal class Program
    {

        static void Main(string[] args)
        {
            /********创建使用匿名类型对象********/
            var person = new { Name = "张三", Sex = "男", Age = 11 };
            Console.WriteLine($"Name:{person.Name},Sex:{person.Sex},Age:{person.Age}");


            /*动态类型处理匿名对象类型。缺点:属性名写错了,也不会报错,运行时出错。*/
            dynamic GetStudentInfo()
            {
                return new { Name = "李四", Sex = "男", Age = 18 };
            }
            dynamic student = GetStudentInfo();
            Console.WriteLine($"Name:{student.Name},Sex:{student.Sex},Age:{student.Age}");


            /*****指定类型接受匿名对象类型(此技巧只在同一程序集中的代码才有效)*****/
            dynamic GetStudentInfo1()
            {
                return new { Name = "", Sex = "", Age = 0 };
            }
            dynamic student1 = GetStudentInfo1();
            Console.WriteLine($"Name:{student.Name},Sex:{student.Sex},Age:{student.Age}");


            /*****通过反射获取匿名类型数据项(测试匿名类型作参数)*****/
            void Test(object obj)
            {
                Type t = obj.GetType();
                PropertyInfo? pName = t.GetProperty("Name");
                PropertyInfo? pSex = t.GetProperty("Sex");
                PropertyInfo? pAge = t.GetProperty("Age");
                Console.WriteLine($"匿名类型:{t.Name}");
                Console.WriteLine($"Name:{pName?.GetValue(obj)},Sex:{pSex?.GetValue(obj)},Age:{pAge?.GetValue(obj)}");
            }
            Test(new { Name = "王五", Sex = "男", Age = 20 });

            /******linq支持对匿名对象集合的查询处理******/
            var people = new[]
            {
                new {Name = "李麻子" ,Sex = "男" , Age = 21 },
                new {Name = "八戒" ,Sex = "男" , Age = 40 },
                new {Name = "悟空" ,Sex = "男" , Age = 500 },
                new {Name = "唐僧" ,Sex = "男" , Age = 25 }
            };

            //班级信息列表
            var classList = new List<Class>
            {
                new Class{Id = 1 ,ClassName = "一年级一班" , Teacher = "张老师" },
                new Class{Id = 2 ,ClassName = "一年级二班" , Teacher = "王老师" },
                new Class{Id = 3 ,ClassName = "二年级一班" , Teacher = "赵老师" },
                new Class{Id = 4 ,ClassName = "二年级二班" , Teacher = "李老师" }
            };

            //学生信息列表
            var studentList = new List<Student>
            {
                new Student{Id = 1 ,Name = "张三" , Age = 8 ,Gender = "男",ClassId = 1},
                new Student{Id = 2 ,Name = "李四" , Age = 9 ,Gender = "女",ClassId = 2},
                new Student{Id = 3 ,Name = "王五" , Age = 8 ,Gender = "男",ClassId = 1},
                new Student{Id = 4 ,Name = "赵六" , Age = 9 ,Gender = "女",ClassId = 2},
                new Student{Id = 5 ,Name = "钱七" , Age = 7 ,Gender = "男",ClassId = 3},
                new Student{Id = 6 ,Name = "孙八" , Age = 7 ,Gender = "女",ClassId = 3}
            };

            var query = from p in people
                        where p.Age > 30
                        select p;

            foreach (var Person in query)
            {
                Console.WriteLine($"Name:{Person.Name},Sex:{Person.Sex},Age:{Person.Age}");
            }

            //使用LINQ进行联合查询,查询学生信息以及对应的班级信息
            var result = from s in studentList
                         join c in classList
                         on s.Id equals c.Id
                         select new
                         {
                            学生姓名 = s.Name,
                            年龄 = s.Age,
                            性别 = s.Gender,
                            班级名称 = c.ClassName,
                            班级教师 = c.Teacher
                         };

            //输出查询结果
            foreach (var item in result)
            {
                Console.WriteLine($"学生姓名:{item.学生姓名},年龄:{item.年龄}," +
                    $"性别:{item.性别},班级名称:{item.班级名称},班级教师:{item.班级教师}");
            }

            //使用 LINQ 进行联合查询,查询学生信息
            var result2 = from s in studentList
                         select new
                         {
                             s.Id, //注:此处可简写,没写属性名,自动以赋值属性为名称
                             s.Name
                         };

            //输出查询结果
            foreach (var item in result2)
            {
                Console.WriteLine($"学生ID:{item.Id},学生姓名:{item.Name}");
            }
        }
    }
}

元组ValueTuple使用技巧(一行代码交换两个变量的值)

            //数据互换(使用元组)
            string str1 = "长江";
            string str2 = "黄河";
            Console.WriteLine($"str1 = {str1}, str2 = {str2}");
            (str1,str2) = (str2,str1);
            Console.WriteLine($"str1 = {str1}, str2 = {str2}");

匿名类型与元组ValueTuple对比

  • 元组是一种泛型结构体,系统预定义好的;
  • 匿名类型不写class、new对象,元组也是一样;
  • 匿名类型 new{…},格式简介,元组更简洁(元素类型1,元素类型2,…)变量名;
            //使用元组(ValueTuple),将多个数据元素构成一个轻型数据结构
            (string, int) x = new ValueTuple<string, int>("鲁班七号",12);
            (string, int) y = ValueTuple.Create("鲁班七号",12);
            //更简洁的语法
            (string, int) z = ("鲁班七号",12);
            Console.WriteLine($"姓名:{z.Item1},年龄:{z.Item2}");
  • 匿名类型 属性名 = 属性值,元组ValueTuple 字段名:字段值
            //使用命名字段1
            var a = (name : "百里守约", age : 22);
            Console.WriteLine($"姓名:{a.name},\t年龄:{a.age}");
            //使用命名字段2
            (string name, int age) b = ("妲己",28);
            Console.WriteLine($"姓名:{b.name},\t年龄:{b.age}");

            //元组的解构
            (string name, int age) = ("廉颇",40);
            var (name1, age1) = ("廉颇",40);
            Console.WriteLine($"姓名:{name},\t年龄:{age}");
            Console.WriteLine($"姓名:{name1},\t年龄:{age1}");
  • 元组ValueTuple参数,返回值方便
            //弃元,放弃不需要的元素
            var tuple = (1,'a' ,3.14);
            var (_,letter,_) = tuple;
            Console.WriteLine(letter);

            //元组作为参数
            void ProcessTuple((string name,int Age)person)
            {
                Console.WriteLine($"Name:{person.name},Age:{person.Age}");
            }
            ProcessTuple(("东皇太一",80));

            //元组作为返回类型
            (int Sum, int Product)GetSumAndProduct(int a,int b)
            {
                return (a + b , a * b);
            }
            var result3 = GetSumAndProduct(3,4);
            Console.WriteLine($"和:{result3.Sum},乘积:{result3.Product}");

            //使用元组作为返回值
            (string, int) GetPerson()
            {
                return ("烬天玉藻前",30);
            }
            //调用方法并解构返回值
            (string name2, int age2) = GetPerson();
            Console.WriteLine($"Name:{name2},乘积:{age2}");
  • 匿名函数在LINQ中使用方便,元组ValueTuple也在LINQ中使用方便
            //使用LINQ进行联合查询,查询学生信息以及对应的班级信息
            var result5 = from s in studentList
                         join c in classList
                         on s.Id equals c.Id
                         select
                         (
                             学生姓名 : s.Name,
                             年龄 : s.Age,
                             性别 : s.Gender,
                             班级名称 : c.ClassName,
                             班级教师 : c.Teacher
                         );

            foreach (var item in result5)
            {
                Console.WriteLine($"学生姓名:{item.学生姓名},年龄:{item.年龄}," +
                    $"性别:{item.性别},班级名称:{item.班级名称},班级教师:{item.班级教师}");
            }
  • 元组字段值可修改
            //元组可以修改
            var f = (name : "关羽", age : 38);
            f.name = "东皇太一";
            Console.WriteLine($"姓名:{f.name},\t年龄:{f.age}");
  • 元组类型支持相等运算符 == 和 != ,它比较的是各个元素
            //元组类型支持相等运算符 == 和 != ,它比较的是各个元素
            var data = (2,2.3);
            if ((2, 2.31) == data)
            {
                Console.WriteLine("数据相等");
            }
            else
            {
                Console.WriteLine("数据不相等");
            }

            //元组中可以使用任意数量的元素。
            var t = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,"比尔盖茨");
            //系统已经帮我们重写了ToString方法,方便输出所有元素
            Console.WriteLine(t.ToString());

思维导图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1184433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDN加速技术:降低企业云服务成本的有效利用

在当今数字化时代&#xff0c;云服务已经成为企业运营的不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;云服务的需求也在不断增长&#xff0c;使企业不得不应对更大的数据传输和负载。这就引出了一个关键问题&#xff1a;如何有效降低企业云服务成本&#xff0c;同时…

kubernetes-调度

目录 一、k8s调度简介 二、影响kubernetes调度的因素 1、nodename 2、nodeselector 3、亲和与反亲和 &#xff08;1&#xff09;nodeaffinity &#xff08;2&#xff09;podaffinity&#xff08;亲和&#xff09; &#xff08;3&#xff09;podantiaffinity&#xff0…

易点易动固定资产管理系统:提升固定资产领用效率的解决方案

在企业运营中&#xff0c;固定资产的领用和管理是一个重要的环节。然而&#xff0c;对于许多企业来说&#xff0c;固定资产领用的过程往往存在效率低下、信息不透明等问题。为了帮助企业提升固定资产领用效率并实现用量控制管理&#xff0c;我们引入了易点易动固定资产管理系统…

小知识:无源无线测温传感器可以安装在哪些部位?

无源无线测温传感器采用超低功耗设计&#xff1a;主芯片采用美国TI公司&#xff0c;功耗低&#xff0c;低可至0.03mw&#xff0c;区别于传统的感应供电&#xff0c;不存在发热现象。测温元件采用耐高温、高精度热敏电阻&#xff0c;测温范围宽至-40℃&#xff5e;200℃&#xf…

WebGL主要接口功能

WebGL&#xff08;Web Graphics Library&#xff09;提供了一组用于在Web浏览器中呈现3D和2D图形的接口类型和功能。下面是一些主要的WebGL接口类型和它们的功能&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交…

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…

tingpng 批量压缩工具

无聊的时候写的 自用 还行 https://ttkeji.lanzoul.com/iPCfY1e5wwwh

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车&#xff0c;搭载3.0L发动机&#xff0c;累计行驶里程约为3.8万km。车主反映&#xff0c;车辆在行驶过程中突然出现发动机抖动且加速无力的现象&#xff0c;于是请求拖车救援。 二、故障诊断 拖车到店后首先试车&#xff0c;发动机怠速轻微抖…

盈科视控荣获创响中国大赛第四名

近日&#xff0c;随着2023“创响中国”安徽省创新创业大赛省内赛区复赛的举办完成&#xff0c;60个项目从6个专项组中脱颖而出。 盈科视控凭借其【IC 载板及先进 PCB 智慧工厂服务商】参赛项目&#xff0c;荣获大赛第四名。 本次大赛由安徽省发改委、安徽省财政厅、合肥市人民…

图形学及图形学进展

有段时间没有来CSDN了&#xff0c;最近一直忙于工作&#xff0c;最近图形学方面&#xff0c;特别是重建图形学方面有了比较大的进展&#xff0c;然后NeRF-SLAM向也有不少进展&#xff0c;但由于ChatGPT风光无限&#xff0c;光芒都没有发出来&#xff0c;后续还是继续创作&#…

【已解决】ChatGPT报错“Unable to load history Retry“等问题

解决ChatGPT历史加载错误&#xff1a;“Unable to load history Retry”问题指南 引言 在使用ChatGPT时&#xff0c;您可能遇到过一个常见的错误提示&#xff1a;“Unable to load history Retry”。这可能会阻止您查看以前的对话历史。本文将为您提供一个详细的教程&#xf…

nodejs express vue 酒店预订系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;vscode&#xff08;webstorm&#xff09;&#xff0c;大于mysql5.5 技术说明&#xff1a; nodejs express vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 用户登录注册 首页显示轮播图&#xff0c;客房分类&…

2010年5月27日Go生态洞察:I/O中Go的热门问答

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【JS】判断字符串是否为 url 的方法

文章目录 用法解析 用法解析 当你传递一个字符串给 URL 构造函数时: 如果字符串是一个有效的 URL&#xff0c;它将返回一个新的 URL 对象。否则&#xff0c;它将返回一个错误。 const url new URL("https://www.baidu.com/"); console.log(url);函数封装&#xf…

Final Cut Pro X 10.6.10 跨行小白都能看懂的安装教程

Final Cut Pro X又名FCPX,是MAC上非常不错的视频非线性剪辑软件,它剪辑速度超凡,具有先进的调色功能、HDR 视频支持&#xff0c;以及 ProRes RAW&#xff0c;让剪辑、音轨、图形特效、整片输出&#xff0c;支持主流的摄像机格式,是专业视频剪辑领域的王者工具。 获取路径地址 最…

C语言每日一题(25)链表的中间结点

力扣 876. 链表的中间结点 题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 思路分析 快慢指针法 用一慢一快指针遍历整个链表&#xff0c;每次遍历&#xff0c;快指针都会比慢指针多…

4141B/4141E/4141F信号源分析仪

4141B/E/F 信号源 频率范围&#xff1a;10MHz~7/26.5/40GHz 4141系列信号源分析仪采用双通道互相关技术&#xff0c;具备优异的相位噪声、幅度噪声和基带噪声测量能力&#xff0c;同时具备瞬态测量、频谱监测、频率功率测量等多种测量功能&#xff0c;具有频率覆盖范围宽、动态…

JavaScript文档操作

文档对象模型(document object model&#xff0c;DOM)是W3C制定的一套技术规范&#xff0c;用来描述JavaScript脚本与HTML文档进行交互的Web标准。DOM规定了一系列标准接口&#xff0c;允许开发人员通过标准方式访问文档结构、操作网页内容、控制样式和行为等。 1、节点 节点…

SpringBoot的bean属性校验

1.导入坐标 <!-- 导入JSR303规范--> <dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId> </dependency> 2.Validated 说明&#xff1a;开启对当前bean的属性注入校验 package com.…

跨链知识指南

跨链知识指南 什么是跨链 跨链就是能够让两个不同的链产生某种关联的技术&#xff0c;或者说能把链A的东西搬到链B&#xff0c;跨链是一个复杂的过程&#xff0c;需要链对链外的信息的获取与验证&#xff0c;需要节点有单独的验证能力等等 什么是跨链桥&#xff1f; 跨链桥…