第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)

发布于:2025-08-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

1、比较器

(1)Array.Sort() ;自定义排序,需要传递一个比较器,可以传入一个Lambda表达式作为比较器

Array.Sort(ints,(x,y)=>y-x);//第二个减去第一个:从大到小
Array.Sort(peoples,(x,y)=>x.Age-y.Age);//第一个减第二个:从小到大

(2)IComparer C# 提供的一个比较器 接口

2、集合

(1)C# 中的集合类(Collection)是专门用于数据存储和检索的类,类中提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类都实现了相同的接口。

集合类的用途多种多样,例如可以动态的为元素分配内存、根据索引访问列表项等等,这些类创建 Object 类的对象集合,Object 类是 C# 中所有数据类型的基类。

(2)在 System.Collections.Generic,System.Collections.Concurrent 和 System.Collections 命名空间下提供了许多集合类型,每种集合类型都有特定的用途,下面以 System.Collection 命名空间为例,该命名空间下提供的集合类型如下表所示:

描述和用法
动态数组(ArrayList) 不固定长度,,可以存储任意类型的数据,并且长度会随着数据内容的增加减少进行改变
泛型集合(List) 类似ArrayList,只是List只能存储相同类型的数据,List的长度也不是固定的
字典(Dictionary) 类似List.只能存储固定类型的数据,长度不固定,以键值对的形式存储数据
哈希表(Hashtable) 哈希表可以使用键来访问集合中的元素。 哈希表中的每一项都由一个键/值对组成,键用于访问集合中的指定项。
排序列表(SortedList) 排序列表是数组和哈希表的组合,可以使用键或索引来访问列表中的各项。 排序列表中包含一个可使用键或索引访问各项的列表,如果使用索引访问各项,则它是一个动态数组,如果使用键访问各项,则它就是一个哈希表。 另外,排序列表中的各项总是按键值进行排序的。
堆栈(Stack) 堆栈代表了一个后进先出的对象集合。 当需要对各项进行后进先出的访问时,则可以使用堆栈。为堆栈中添加一项称为推入项目,从堆栈中移除一项称为弹出项目。
队列(Queue) 队列代表了一个先进先出的对象集合。 当需要对各项进行先进先出的访问时,则可以使用队列。为队列中添加项目称为入队,为队列中移除项目称为出队。
点阵列(BitArray) 点阵列代表了一个使用 1 和 0 来表示的二进制数组。 当需要存储比特位,但是事先不知道具体位数时,则可以使用点阵列。可以使用整型索引从点阵列集合中访问各项,索引从零开始。

3、ArrayList:动态数组

3.1 定义

(1)ArrayList实现了IList,ICollection,Ienumerable,ICloneable接口,

  • IList:List列表,主要负责集合的插入,添加,删除,取索引,判断是否包含某个项等操作。

  • ICollection:Collection集合。主要负责集合中的项的个数,集合的复制,拷贝等。

  • IEnumerable:Enumerable可枚举的; 可数的,可枚举的。主要实现迭代器,实现此接口类都可以被循环,被遍历,被迭代,被枚举

  • ICloneable:Cloneable克隆,主要负责集合的克隆(复制,拷贝)

(1)Array数组 长度固定 只能存储相同数据类型的数据

ArrayList 动态数组,一个集合 长度不固定可以存储不同数据类型

(2)使用ArrayList需要引入System.Collections命名空间

3.2 属性

(1)arrayList.Count:长度

ArrayList arrayList2 = new ArrayList() { 1,2,3,true,"吴亦凡",'a',new int[] {111,222,333} };
Console.WriteLine(arrayList2.Count);//长度
for (int i = 0; i < arrayList2.Count; i++)
{
    Console.WriteLine(arrayList2[i]);
}
//var 或者object
foreach (var v in arrayList2)
{
    Console.WriteLine(v);
}

(2)ArrayList通过索引访问和设置值

 arrayList2[0] = "吴亦凡";
 Console.WriteLine(arrayList2[0]);

(3)ArrayList存储值是将值变为object类型,进行一个装箱的操作,取出的值也为object类型数据

object str1 =  arrayList2[0];
string str2 =  (string)arrayList2[0];
string str3 =  arrayList2[0].ToString();
string str4 =  arrayList2[0] as  string;
3.3 ArrayList的方法

(1)arrayList.Add();将参数添加到ArrayList的末尾

ArrayList arrayList3 = new ArrayList() { 1,2};
arrayList3.Add(123);//将123转成object  //装箱

(2)arrayList.AddRange();将参数集合中每一项的内容添加到arrayList的末尾

int[] ints1 = { 111, 222, 333 };
arrayList3.AddRange(ints1);

(3)arrayList.Clear();清空数组,删除arrayList中所有的元素,并将Count设为0

arrayList3.Clear();
Console.WriteLine(arrayList3.Count);//0

(4)arrayList.Insert();在指定的索引位置插入数据

arrayList3.Insert(1,"张三");

(5)arrayList.InsertRange();在指定索引位置插入集合中的内容

arrayList3.InsertRange(2, ints1);

(6)arrayList.Contains();判断ArrayList中是否有指定的数据,存在返回true,不存在返回false

Console.WriteLine(arrayList3.Contains("李斯"));

(7)arrayList.GetRange();从arrayList截取对应的数据,返回一个新的ArrayList;参数1:开始截取的索引位置;参数2:截取的个数

ArrayList list2  =  arrayList3.GetRange(0,3);

(8)arrayList.SetRange();将参数2集合中的元素添加到当前集合中;参数1开始放的索引位置

arrayList3.SetRange(1,ints1);

(9)arrayList.IndexOf();从前向后查询参数首次出现的索引位置,查询不到返回-1;

Console.WriteLine(arrayList3.IndexOf("张三"));

(10)arrayList.LastIndexOf();从后向前查询参数首次出现的索引位置,查询不到返回-1;

Console.WriteLine(arrayList3.LastIndexOf("李斯"));

(11)arrayList.Remove();删除arrayList中第一个匹配的数据

arrayList3.Remove("张三");

(12)arrayList.RemoveAt();删除ArrayList中指定索引位置的数据

arrayList3.RemoveAt(0);

(13)arrayList.RemoveRange();删除指定范围的数据,从0开始删除,删除3个

arrayList3.RemoveRange(0,3);

(14)arrayList3.Reverse();反转

4、List:泛型集合

(1)List 长度不固定 只能存储相同数据类型的数据;

格式:List<数据类型> 变量名=new List<数据类型>();

(2)泛型 Type<T,>

(3)list1.Count();List长度

(4)list.Add(1); list.AddRange(); list.Insert();

(5)List的高阶函数和Array类的相同

不同点: Array类的高阶函数,是静态的 ArrList.XXX(实例,条件) List类的高阶函数,是非静态的 实例.xxx(条件)

5、Dictionary 字典

(1)字典是有键(Key)和值(value)的集合

(2)Dictionary<string,int> string是key键的类型 int value的类型;其中key和索引类似,必须是唯一的,但是索引只能是数字,并且是有序的,key支持多种数据类型

(3)字典的键必须是唯一的

(4)dic.Add(); 添加; 参数1 键 参数2 值

keyValuePairs3.Add("三班", new List<string>() { "111", "2222", "333" });

(5)访问:通过键访问

Console.WriteLine(keyValuePair1s["a"]);//97

(6)dic1.Keys;获取所有的Key

Dictionary<string, List<string>>.KeyCollection keys1 = keyValuePairs3.Keys;

(7)dic1.Values;获取所有的值

Dictionary<string, List<string>>.ValueCollection values1 = keyValuePairs3.Values;

(8)dic1.Remove();dic.Clear();

(9)ContainsKey() 判断是否包含某个key;

ContainsValue() 判断是否包含某个value;

(10)循环字典

KeyValuePair<数据类型,数据类型> 数据类型 要和遍历的字典的类型保持一直 item就是字典中键值对

KeyValuePair<string, int> 使用var替换也是可以的

 foreach (KeyValuePair<string, int> item in keyValuePair1s)
            {
                Console.WriteLine("键:"+item.Key);
                Console.WriteLine("值:"+item.Value);
            }

(11)FirstOrDefault()返回字典中第一个满足条件的键值对

6、Hashtable :哈希表

6.1 Hashtable 类中的属性

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

属性 描述
Count 获取哈希表中包含的键值对的个数
IsFixedSize 获取一个值,用来表示哈希表是否具有固定大小
IsReadOnly 获取一个值,用来表示哈希表是否只读
Keys 获取一个 ICollection,其中包含哈希表中的键
Values 获取一个 ICollection,其中包含哈希表中的值
6.2 Hashtable 类中的方法

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

方法名 描述
public virtual void Add(object key, object value) 向哈希表中添加一个带有指定的键和值的元素
public virtual void Clear() 从哈希表中移除所有的元素
public virtual bool ContainsKey(object key) 判断哈希表是否包含指定的键
public virtual bool ContainsValue(object value) 判断哈希表是否包含指定的值
public virtual void Remove(object key) 从哈希表中移除带有指定的键的元素

7、SortedList:排序列表

7.1 下表列出了 SortedList 类中一些常用的属性:
属性 描述
Capacity 获取或设置排序列表中可包含的元素个数
Count 获取排序列表中的元素个数
IsFixedSize 判断排序列表是否具有固定大小
IsReadOnly 判断排序列表是否只读
Item 获取或设置排序列表中指定键所关联的值
Keys 获取一个包含排序列表中所有键的集合
Values 获取一个包含排序列表中所有值的集合
7.2 下表列出了 SortedList 类中一些常用的方法:
方法名 描述
public virtual void Add(object key, object value) 向排序列表中添加一个带有指定的键和值的元素
public virtual void Clear() 从排序列表中移除所有的元素
public virtual bool ContainsKey(object key) 判断排序列表中是否包含指定的键
public virtual bool ContainsValue(object value) 判断排序列表中是否包含指定的值
public virtual object GetByIndex(int index) 获取排序列表中指定索引处的值
public virtual object GetKey(int index) 获取排序列表中指定索引处的键
public virtual IList GetKeyList() 获取排序列表中的键
public virtual IList GetValueList() 获取排序列表中的值
public virtual int IndexOfKey(object key) 返回排序列表中指定键的索引,索引从零开始
public virtual int IndexOfValue(object value) 返回排序列表中指定值第一次出现的索引,索引从零开始
public virtual void Remove(object key) 从排序列表中移除带有指定键的元素
public virtual void RemoveAt(int index) 移除排序列表中指定索引处的元素
public virtual void TrimToSize() 将排序列表的容量设置为排序列表中元素的实际个数

8、Stack:堆栈

在 C# 中,堆栈(Stack)类表示一个后进先出的对象集合,当需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素

8.1 下表列出了 Stack 类中一些常用的属性:
属性 描述
Count 获取堆栈中包含的元素个数
IsSynchronized 判断是否同步对堆栈的访问(线程安全)
SyncRoot 获取可用于同步对堆栈访问的对象
8.2 下表列出了 Stack 类中一些常用的方法:
方法名 描述
public virtual void Clear() 从堆栈中移除所有的元素
public virtual bool Contains(object obj) 判断某个元素是否在堆栈中
public virtual object Peek() 返回在堆栈顶部的对象,但不移除它
public virtual object Pop() 移除并返回在堆栈顶部的对象
public virtual void Push(object obj) 向堆栈顶部添加一个对象
public virtual object[] ToArray() 复制堆栈到一个新的数组中

9、Queue:队列

在 C# 中,队列(Queue 类)与堆栈类似,它代表了一个先进先出的对象集合,当您需要对项目进行先进先出访问时,则可以使用队列。向队列中添加元素称为入队(enqueue),从堆栈中移除元素称为出队(deque)。

8.1 Queue 类中的属性
属性 描述
Count 获取队列中包含的元素个数
IsSynchronized 判断是否同步对队列的访问(线程安全)
SyncRoot 获取可用于同步对队列访问的对象
8.2 Queue 类中的方法
方法名 描述
public virtual void Clear() 从队列中移除所有的元素
public virtual bool Contains(object obj) 判断某个元素是否在队列中
public virtual object Dequeue() 移除并返回在队列开头的对象
public virtual void Enqueue(object obj) 向队列的末尾处添加一个对象
public virtual object[] ToArray() 复制队列到一个新的数组中
public virtual void TrimToSize() 将队列的容量设置为队列中元素的实际个数

10、总结

名称 类型是否固定 长度是否固定 长度表示方式
Array Length
ArrayList Count
List Count
Dictionary Count
Hastable Count
SortList Count
Stack Count
Queue Count

网站公告

今日签到

点亮在社区的每一天
去签到