C#(四十六)之C#集合Collections

简介: 集合是一组相互关联的对象,数组也可以看做是集合。集合中的对象称之为元素。

QQ图片20220426163349.jpg

集合:


集合是一组相互关联的对象,数组也可以看做是集合。集合中的对象称之为元素。


Array类:


Array 类的属性


下表列出了 Array 类中一些最常用的属性:


序号 属性&描述
1 IsFixedSize   获取一个值,该值指示数组是否带有固定大小。
2 IsReadOnly   获取一个值,该值指示数组是否只读。
3 Length   获取一个 32 位整数,该值表示所有维度的数组中的元素总数。
4 LongLength   获取一个 64 位整数,该值表示所有维度的数组中的元素总数。
5 Rank   获取数组的秩(维度)。

 

Array 类的方法


下表列出了 Array 类中一些最常用的方法:


序号 方法&描述
1 Clear   根据元素的类型,设置数组中某个范围的元素为零、为 false 或者为 null。
2 Copy(Array,   Array, Int32)   从数组的第一个元素开始复制某个范围的元素到另一个数组的第一个元素位置。长度由一个 32 位整数指定。
3 CopyTo(Array,   Int32)   从当前的一维数组中复制所有的元素到一个指定的一维数组的指定索引位置。索引由一个 32 位整数指定。
4 GetLength   获取一个 32 位整数,该值表示指定维度的数组中的元素总数。
5 GetLongLength   获取一个 64 位整数,该值表示指定维度的数组中的元素总数。
6 GetLowerBound   获取数组中指定维度的下界。
7 GetType   获取当前实例的类型。从对象(Object)继承。
8 GetUpperBound   获取数组中指定维度的上界。
9 GetValue(Int32)   获取一维数组中指定位置的值。索引由一个 32 位整数指定。
10 IndexOf(Array,   Object)   搜索指定的对象,返回整个一维数组中第一次出现的索引。
11 Reverse(Array)   逆转整个一维数组中元素的顺序。
12 SetValue(Object,   Int32)   给一维数组中指定位置的元素设置值。索引由一个 32 位整数指定。
13 Sort(Array)   使用数组的每个元素的 IComparable 实现来排序整个一维数组中的元素。
14 ToString   返回一个表示当前对象的字符串。从对象(Object)继承。

 

ArrayList类:


使用命名空间:


using System.Collections;


下表列出了 ArrayList 类的一些常用的 属性


属性 描述
Capacity 获取或设置 ArrayList 可以包含的元素个数。
Count 获取 ArrayList 中实际包含的元素个数。
IsFixedSize 获取一个值,表示 ArrayList 是否具有固定大小。
IsReadOnly 获取一个值,表示 ArrayList 是否只读。
Item 获取或设置指定索引处的元素。


下表列出了 ArrayList 类的一些常用的 方法


序号 方法名&描述
1 public virtual int Add( object value );   在 ArrayList 的末尾添加一个对象。
2 public virtual void AddRange( ICollection c );   在 ArrayList 的末尾添加 ICollection 的元素。
3 public virtual void Clear();   从 ArrayList 中移除所有的元素。
4 public virtual bool Contains( object item );   判断某个元素是否在 ArrayList 中。
5 public virtual ArrayList GetRange( int index, int count   );   返回一个 ArrayList,表示源 ArrayList 中元素的子集。
6 public virtual int IndexOf(object);   返回某个值在 ArrayList 中第一次出现的索引,索引从零开始。
7 public virtual void Insert( int index, object value   );   在 ArrayList 的指定索引处,插入一个元素。
8 public virtual void InsertRange( int index, ICollection   c );   在 ArrayList 的指定索引处,插入某个集合的元素。
9 public virtual void Remove( object obj );   从 ArrayList 中移除第一次出现的指定对象。
10 public virtual void RemoveAt( int index );   移除 ArrayList 的指定索引处的元素。
11 public virtual void RemoveRange( int index, int count   );   从 ArrayList 中移除某个范围的元素。
12 public virtual void Reverse();   逆转 ArrayList 中元素的顺序。
13 public virtual void SetRange( int index, ICollection c   );   复制某个集合的元素到 ArrayList 中某个范围的元素上。
14 public virtual void Sort();   对 ArrayList 中的元素进行排序。
15 public virtual void TrimToSize();   设置容量为 ArrayList 中元素的实际个数。

 

ArrayList类自动扩容。


ArrayList arrList = new ArrayList(3);// stringBuilder
// 自动扩容
arrList.Add("qqq");
arrList.Add("aaa");
arrList.Add("bbb");
arrList.Add("zzz");
arrList.Add("mmm");

 

一些arraylist方法使用示例:


int[] arr = new int[5]{6,2,9,4,5};
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i]+",");
            }
            Console.WriteLine("
");
            // 声明一个空数组,并复制
            int[] arrays = new int[4];
            Array.Copy(arr,arrays,arrays.Length);
            for (int i = 0; i < arrays.Length; i++)
            {
                Console.Write(arrays[i] + ",");
            }
            Console.WriteLine("
");
            // 数组排序
            Array.Sort(arr);
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + ",");
            }
            Console.WriteLine("
");
            ArrayList arrList = new ArrayList(3);// stringBuilder
            // 自动扩容
            arrList.Add("qqq");
            arrList.Add("aaa");
            arrList.Add("bbb");
            arrList.Add("zzz");
            arrList.Add("mmm");
            for (int i = 0; i < arrList.Count; i++)
            {
                Console.WriteLine(arrList[i]);
            }
            Console.Write("
");
            // 删除元素
            arrList.Remove("aaa");
            arrList.Add("fff");
            for (int i = 0; i < arrList.Count; i++)
            {
                Console.WriteLine(arrList[i]);
            }
            Console.Write("
");
            // 删除指定索引
            arrList.RemoveAt(1);
            for (int i = 0; i < arrList.Count; i++)
            {
                Console.WriteLine(arrList[i]);
            }
            Console.Write("
");
            // 指定位置添加
            arrList.Insert(0,"asdf");
            for (int i = 0; i < arrList.Count; i++)
            {
                Console.WriteLine(arrList[i]);
            }
            Console.Write("
");
            // 从索引0开始删到索引2
            arrList.RemoveRange(0, 2);
            for (int i = 0; i < arrList.Count; i++)
            {
                Console.WriteLine(arrList[i]);
            }
            Console.Write("
");
            // 将索引为0到2的元素复制给goods列表
            ArrayList goods = arrList.GetRange(0,2);
            for (int i = 0; i < goods.Count; i++)
            {
                Console.WriteLine(goods[i]);
            }
            Console.Write("
");
            int asdf = goods.Capacity; // 输出6
            Console.WriteLine(asdf);

 

Array 和 ArrayList优缺点:


Array:


优点: 它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单。可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查找法查找元素,效率高。

缺点: 同时,数组也有很多缺点。数组分配在一块连续的数据空间上,因此分配空间时必须确定大小。空间的连续,也导致了存储效率低,插入和删除元素效率比较低,而且麻烦。如果,要增添一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样,你想删除一个元素,需要移动大量元素去填补被移动的元素。

 

ArrayList:


优点: 它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除

缺点: 在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。



目录
相关文章
|
6月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
80 0
|
6月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
81 0
|
2天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
77 2
|
1月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
2月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
46 1
|
3月前
|
存储 C# 索引
C# 集合语法全解
C# 集合语法全解
29 0
|
存储 安全 搜索推荐
c#集合_键值对Dictionary & SortedList
在 C# 中,键值对是一种常见的数据结构,可以使用不同的集合类实现。以下是常用的键值对集合类::一种使用哈希表实现的键值对集合。它通过将键哈希为桶号,然后将值存储在桶中进行快速查找。:一种基于数组实现的键值对集合。它会将键值对按照键排序并存储在数组中,以支持快速访问、查找和枚举。:一种使用红黑树实现的键值对集合。它能够按照键的排序进行快速查找,也可以快速地插入和删除键值对,并且该树具备自平衡的特性,使得插入、删除和搜索性能都非常优秀。
143 1
|
6月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
59 1
|
6月前
|
存储 C#
33.c#:hashtable集合
33.c#:hashtable集合
39 1