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 | ||||