文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#泛型集合类List<T>如何使用

2023-06-30 17:26

关注

这篇“C#泛型集合类List<T>如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#泛型集合类List<T>如何使用”文章吧。

为什么选择使用List,而不是使用Array,或者ArryList

首先要说下数组的局限性

(1) 数组中元素是固定的:类型和数量都必须确定!一旦定义,无法改变其元素总数
(2) 如果使用数组类型存储数据,一旦项目需求有变化,那必须修改原数组相关代码,得不偿失
(3) 如果数据总数非常大,那数组在定义时就要把长度(即元素总数)定义的非常大,造成了存储空间的巨大浪费!

而List跟数组比较,他可以动态增减元素个数,无任何限制,直接秒杀数组

当然,实际项目开发中,对于一些固定的枚举值,类型集合等,或相关数据处理中,使用数组还是相当方便的,它并不是没用的,而是相比较List,使用的空间小一些罢了(存在即有用!)

然后再说下ArryList

这个直接截图一下官网的相关建议

C#泛型集合类List<T>如何使用

既然官网都不建议使用,那可见它真的不常用,而不是不能用
没有使用价值的东西不会被留下来的,对吧!

跟List比较,他还是有一个优点的,就是他可以存储类型不一样的对象数据,而List泛型集合类,其中T必须是对他存储元素对象的约束,必须一致性!

ArrayList存储的对象如果是值类型,那就涉及到装箱操作,这个对程序性能影响很大,所以不到万不得已,还是不要用!

而且ArrayList里面存放元素对象类型都不一致,在C#(强类型语言)中处理时,还需要判断,还要涉及到频繁装箱拆箱,性能不说,这不是自讨苦吃嘛....

其实就跟强类型语言和弱类型语言一样,如果把js比作弱类型,那ts就是强类型,js写起来很爽(var声明变量时,变量几乎可以是任意类型...),但是出现报错、异常,找起来会相当麻烦,因为写的时候,约束的少,那最后运行的时候,都会补回来的!而ts有类型约束以后,写起来有了一些束手束脚,但是基本不会出错,而且写多了都一样!这就是大部分后端语言都是强类型的一个重要原因吧(个人观点....)!

List特点:只能添加一种数据类型,可以是基本的值类型也可以实引用类型,一旦数据类型确定,不可更改!

List做数据处理时,完全可以采用强大的Linq,处理起来那是相当的方便\

去重、交集、并集、差集操作

注:这里仅介绍当List中T为引用类型(对象)时,基本类型(值类型)就不说了,因为可以直接用!....引用类型则不行!

另外还一个类型比较特殊,也要单独拿出来提一嘴,就是string,在C#中它属于引用类型,但是它类似于值类型,可以直接进行比较,在这完全可以归属到值类型当中了。

当然使用Linq中GoupBy + Select等方法还是可以做到去重的,但是这里说的并不是这些东西,而是直接使用IntersectExceptDistinctUnion

那么为什么引用类型不能直接比较呢,其实稍微懂一点底层的都知道,引用类型,引用两个字就道出了缘由!其值为一个引用地址,在栈内存中,地址是唯一的,但是也有可能两个地址指向同一个堆中的值呢....
因此要想比较,先把他的值点出来比较,可以只比较某一个值,也可以是全部

重写Equals() 和 GetHashCode()

为什么要重新呢,因为这些比较方法的内部就是调用者两个方法进行比较的,他们仅适用于值类型的比较,对象需要重写内部逻辑了!

要想重写,需要写一个类,继承IEqualityComparer接口即可

public class MyComparer : IEqualityComparer<Person>{    public bool Equals([AllowNull] Person x, [AllowNull] Person y)    {        return x.name == y.name && x.age == y.age;    }    public int GetHashCode([DisallowNull] Person obj)    {        return obj.name.GetHashCode() + obj.age.GetHashCode();        //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 两种写法都可以    }}

其实上面写法还是有点不严谨
(1)没有null判断,如果某一属性值为空,那就可能抛异常
(2)并未将对象的所有属性进行比较,如上面,仅仅比较名称和年龄,那全国20岁叫张三的人肯定不止一个,达不到目的了(这里仅仅是举个例子,具体比较多少属性,还是根据项目中实际情况而定的...如果有Id,那完全可以比较Id不是更快....)

把(1)加进去重新写一遍

public class MyComparer : IEqualityComparer<Person>{    public bool Equals([AllowNull] Person x, [AllowNull] Person y)    {        if(x == null || y == null) return false;        if(x.name == y.name && x.age == y.age) return true;        return false;    }    public int GetHashCode([DisallowNull] Person obj)    {        if(obj == null) return 0;        return obj.name.GetHashCode() + obj.age.GetHashCode();        //return obj.name.GetHashCode() ^ obj.age.GetHashCode();// 两种写法都可以    }}

简单使用

using System;using System.Collections.Generic;using System.Diagnostics.CodeAnalysis;using System.Linq;namespace ConsoleApp1{    class Program    {        static void Main(string[] args)        {            //交集:集合A.Intersect(集合B)            var _old = new List<Person> {                new Person{name="zs",age=21},                new Person{name="ls",age=10},                new Person{name="ww",age=13},                new Person{name="ls",age=10},                new Person{name="ww",age=13}            };            var _new = new List<Person> {                new Person{name="zs",age=21},                new Person{name="ls",age=31},                new Person{name="ww3",age=13}            };            var _obj = _old.Intersect(_new,new MyComparer()).ToList();            for (int i = 0; i < _obj.Count; i++)            {                var x = _obj[i];                Console.WriteLine("name:{0},age:{1}", x.name, x.age);                //结果: name:zs,age:21            }            Console.ReadLine();        }    }    public class Person    {        public string name { get; set; }        public int age { get; set; }    }}
var _oj2 = _old.Except(_new, new MyComparer()).ToList();//结果:name:ls,age:10name:ww,age:13
var _oj2 = _old.Union(_new, new MyComparer()).ToList();//结果:name:zs,age:21name:ls,age:10name:ww,age:13name:ls,age:31name:ww3,age:13
var _oj2 = _old.Distinct(new MyComparer()).ToList();//结果:name:zs,age:21name:ls,age:10name:ww,age:13

以上就是关于“C#泛型集合类List<T>如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯