C# List类学习及深拷贝

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

前言:

List是我们在编程的时候用的比较多的一种类型,所以今天来学习一下List,它是一种泛型的集合,有着许多的变化还有许多的方法,不学一下根本不知道,顺带看看这个深拷贝,今天我们一起来学一下吧,内容比较简单,希望大家勿喷,创作不易,大家顺便点点赞吧,你的点赞收藏关注,是我写文章的动力,栓Q啦。

haoping21111

一、List类

List有着许多的方法,都是值得我们去学习的,很多时候的我不知道怎么样实现这个的效果,就可以看看这篇文章,我把这些方法都截取下来,方便我们查询,建议收藏这篇文章,好了看下面的方法吧。

Capacity 获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。
Count 获取 List 中包含的元素数。
Item[Int32] 获取或设置指定索引处的元素。
Add(T) 将对象添加到 List 的结尾处。
AddRange(IEnumerable) 将指定集合的元素添加到 List 的末尾。
AsReadOnly() 返回当前集合的只读 ReadOnlyCollection 包装器。
BinarySearch(Int32, Int32, T, IComparer) 使用指定的比较器在已排序 List 的某个元素范围中搜索元素,并返回该元素从零开始的索引。
BinarySearch(T) 使用默认的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。
BinarySearch(T, IComparer) 使用指定的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。
Clear() 从 List 中移除所有元素。
Contains(T) 确定某元素是否在 List 中。
ConvertAll(Converter) 将当前 List 中的元素转换为另一种类型,并返回包含已转换元素的列表。
CopyTo(Int32, T[], Int32, Int32) 从目标数组的指定索引处开始,将元素的范围从 List 复制到兼容的一维数组。
CopyTo(T[]) 从目标数组的开头开始,将整个 List 复制到兼容的一维数组。
CopyTo(T[], Int32) 从目标数组的指定索引处开始,将整个 List 复制到兼容的一维数组。
Equals(Object) 确定指定对象是否等于当前对象。
Exists(Predicate) 确定 List 是否包含与指定谓词定义的条件匹配的元素。
Find(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的第一个匹配元素。
FindAll(Predicate) 检索与指定谓词定义的条件匹配的所有元素。
FindIndex(Int32, Int32, Predicate) 搜索与指定谓词所定义的条件相匹配的一个元素,并返回 List 中从指定的索引开始、包含指定元素个数的元素范围内第一个匹配项的从零开始的索引。
FindIndex(Int32, Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回 List 中从指定索引到最后一个元素的元素范围内第一个匹配项的从零开始的索引。
FindIndex(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中第一个匹配元素的从零开始的索引。
FindLast(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的最后一个匹配元素。
FindLastIndex(Int32, Int32, Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回 List 中包含指定元素个数、到指定索引结束的元素范围内最后一个匹配项的从零开始的索引。
FindLastIndex(Int32, Predicate) 搜索与由指定谓词定义的条件相匹配的元素,并返回 List 中从第一个元素到指定索引的元素范围内最后一个匹配项的从零开始的索引。
FindLastIndex(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中最后一个匹配元素的从零开始的索引。
ForEach(Action) 对 List 的每个元素执行指定操作。
GetEnumerator() 返回循环访问 List 的枚举数。
GetHashCode() 作为默认哈希函数。
GetRange(Int32, Int32) 在源 List 中创建元素范围的浅表复制。
GetType() 获取当前实例的 Type。
IndexOf(T) 搜索指定的对象,并返回整个 List 中第一个匹配项的从零开始的索引。
IndexOf(T, Int32) 搜索指定对象并返回 List 中从指定索引到最后一个元素这部分元素中第一个匹配项的从零开始索引。
IndexOf(T, Int32, Int32) 搜索指定对象并返回 List 中从指定索引开始并包含指定元素数的这部分元素中第一个匹配项的从零开始索引。
Insert(Int32, T) 将元素插入 List 的指定索引处。
InsertRange(Int32, IEnumerable) 将集合中的元素插入 List 的指定索引处。
LastIndexOf(T) 搜索指定对象并返回整个 List 中最后一个匹配项的从零开始索引。
LastIndexOf(T, Int32) 搜索指定对象并返回 List 中从第一个元素到指定索引这部分元素中最后一个匹配项的从零开始的索引。
LastIndexOf(T, Int32, Int32) 搜索指定对象并返回 List 中到指定索引为止包含指定元素数的这部分元素中最后一个匹配项的从零开始索引。
MemberwiseClone() 创建当前 Object 的浅表副本。
Remove(T) 从 List 中移除特定对象的第一个匹配项。
RemoveAll(Predicate) 移除与指定的谓词所定义的条件相匹配的所有元素。
RemoveAt(Int32) 移除 List 的指定索引处的元素。
RemoveRange(Int32, Int32) 从 List 中移除一系列元素。
Reverse() 将整个 List 中元素的顺序反转。
Reverse(Int32, Int32) 将指定范围中元素的顺序反转。
Sort() 使用默认比较器对整个 List 中的元素进行排序。
Sort(Comparison) 使用指定的 Comparison,对整个 List 中的元素进行排序。
Sort(IComparer) 使用指定的比较器对整个 List 中的元素进行排序。
Sort(Int32, Int32, IComparer) 使用指定的比较器对 List 中某个范围内的元素进行排序。
ToArray() 将 List 的元素复制到新数组中。
ToString() 返回表示当前对象的字符串。
TrimExcess() 将容量设置为 List 中元素的实际数目(如果该数目小于某个阈值)。
TrueForAll(Predicate) 确定 List 中的每个元素是否都与指定谓词定义的条件匹配。
ICollection.CopyTo(Array, Int32) 从特定的 ICollection 索引开始,将 Array 的元素复制到一个 Array 中。
ICollection.IsSynchronized 获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。
ICollection.SyncRoot 获取可用于同步对 ICollection 的访问的对象。
ICollection.IsReadOnly 获取一个值,该值指示 ICollection 是否为只读。
IEnumerable.GetEnumerator() 返回循环访问集合的枚举数。
IEnumerable.GetEnumerator() 返回循环访问集合的枚举数。
IList.Add(Object) 将某项添加到 IList 中。
IList.Contains(Object) 确定 IList 是否包含特定值。
IList.IndexOf(Object) 确定 IList 中特定项的索引。
IList.Insert(Int32, Object) 在 IList 中的指定索引处插入一个项。
IList.IsFixedSize 获取一个值,该值指示 IList 是否具有固定大小。
IList.IsReadOnly 获取一个值,该值指示 IList 是否为只读。
IList.Item[Int32] 获取或设置指定索引处的元素。
IList.Remove(Object) 从 IList 中移除特定对象的第一个匹配项。

二、常用的方法使用

只是简单演示比较常用的,方便新人学习

2.1 Sort方法

Sort默认为升序排序

image-20220813165914871

简单的倒序排序,当然也有倒序排序的方法,OrderBy()属于list的扩展方法,有兴趣的可以去看看,用的是字典类型,使用键值对排序

image-20220813171318339

2.2 Reverse()反转

不知道大家在学习的C语言的时候有没有做过反转函数,就叫你反转这个数组,在C#里面直接写好的方法调用就好了。

image-20220813171919607

2.3 Count,Add,Clear,Remove,Contains,IndexOF

Count是统计list的个数通常作为循环的条件

Add添加数据从后面添加栈的形式,注意你在循环里面存值一定要每次都new,不然就只会保存一个值,最后退出循环的那个值

Clear 清空整个list

ReMove删除,可以删除指定的值,也可以删除首尾,删除首list.Remove(list[0]),删除尾list.remove(list[list.count-1])

Contains判断list是否有这个值

IndexOF 返回第一出线这个值的位置

image-20220813173211883

三、深拷贝问题

关于这个拷贝问题,是需要我们注意的,list存放的只是我们值的地址,也就意味着当你的某个值需要保存在list中,然后再将你的那个值在别的地方用过,就会改变list中的值,并不是直接静态保存,需要我们做深拷贝,反射。还有就是我们在赋值的时候,我演示一下,看下图:。

image-20220813180132201

那么我们应该如何去保存这些值呢,就需要涉及到我们的深拷贝的问题。关于这个拷贝问题我也只会一点点,但是对于我来说够用就行,你有想法继续深入可以百度开发,哈哈哈。

image.png 这个是使用序列化的方法用两个list实现深拷贝。

image-20220813185518949

四、代码逻辑

    [Serializable]
    public  class IC
    {
        int test;

        public int Test { get => test; set => test = value; }
    }
//上面是我的实体类声明

        private void Form1_Load(object sender, EventArgs e)
        {
            List<IC> list = new List<IC>();
            List<IC> IClist = new List<IC>();
            //int[] count = {5,6,7,1,5,3,9,7,5,9};
            for (int i = 0; i < 10; i++)
            {
                IC ic = new IC();
                ic.Test = i;
                list.Add(ic);
                IClist.Add(Clone<IC>(list[i]));
                ic.Test = 3;
            }
            foreach (var i in IClist)
            {
                Console.WriteLine(i.Test);
            }
        }
        public static T Clone<T>(T RealObject)//使用序列化,可以直接复制粘贴   IClist.Add(Clone<IC>(list[i]));这样调用
        {
            using (Stream objectStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, RealObject);
                objectStream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(objectStream);
            }
        }
        //这个是函数调用
复制代码

五、总结

这篇文章只是简单的对List类的学习,东西不多,但是实用性挺强建议收藏一下,哈哈哈哈,如果你觉得这篇文章对你有用,欢迎点赞收藏评论,关注一下吧,你点点赞是我更文的动力,栓Q。

520520

猜你喜欢

转载自juejin.im/post/7131323975346602021