数组:相同数据类型的元素按一定顺序排列的集合,值类型数据。
优点:数组在存储数据的时候是连续存储的,因此可以快速而容易地从头到尾遍历元素,可以快速的修改元素等等。
缺点:在声明数组的时候必须先声明指定的长度。如果事先不知道存储的大小,很容易会造成声明的长度过长导致内存空间浪费,过短则造成数据的溢出。而且在两个数据中间插入数据也是非常麻烦的,需要将插入位置后面的数组全部移动位置。
集合:是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList接口。集合类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持,引用类型数据。
优点:集合可以根据使用大小按需动态增加,不用事先设置大小,可以随意的添加数据,插入或移除某一范围元素也比较方便。
缺点:因为集合元素动态分配,位置不固定,所以不容易定位。
数组应用场景使用技巧:
1.数组不指定长度简化定义:
int [] myArray = {1,2,3,4,5};
2.使用SequenceEqual比较两个数组是否相等:
int[] array1 = new int[] { 1, 2, 3 };
int[] array2 = new int[] { 1, 2, 4};
if (Enumerable.SequenceEqual(array1 ,array2))
{
Console.WriteLine("两个数组相等");
}
else
{
Console.WriteLine("两个数组不相等");
}
3.将数组清空:
int[] A = { 0, 1, 2, 3 };
//将数组A中从下标0开始后的3个元素清空
Array.Clear(A, 0, 3);
4.将一个数组内容复制给另一个数组:
int[] A = { 0, 1, 2, 3 };
int[] B = { 4, 5, 6, 7 };
//将数组B前3个元素复制到数组A前3个元素
Array.Copy(B, A, 3);
//将数组B下标为1开始的两个数复制到数组A中下标为2及后的两个位置
Array.Copy(B, 1, A, 2, 2);
集合应用场景使用技巧:
List集合:
1.Add 将对象添加到 List 的结尾处。
2.AddRange 将指定集合的元素添加到 List 的末尾。
3.Remove 从 List 中移除特定对象的第一个匹配项。
4.Insert 将元素插入 List 的指定索引处。
5.InsertRange 将集合中的某个元素插入 List 的指定索引处。
6.Clear 从 List 中移除所有元素。
7.Contains 确定某元素是否在 List 中
8.Exists 确定 List 是否包含与指定谓词所定义的条件相匹配的元素。
9.IndexOf(T) 搜索指定的对象,并返回整个 List 中第一个匹配项的从零开始的索引。
10.LastIndexOf(T) 搜索指定的对象,并返回整个 List 中最后一个匹配项的从零开始的索引。
11.CopyTo(T[]) 将整个 List 复制到兼容的一维数组中,从目标数组的开头开始放置。
int[] A = { 1, 2, 3, 4, 0, 0, 0, 0 };
List B = new List() { 5, 6, 7, 8 };
//将集合A中索引0开始的4个元素复制到数组A索引为4的后四个元素位置
B.CopyTo(0, A, 4, 4);
12.Find 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的第一个匹配元素。
13.FindIndex(Predicate) 搜索与指定谓词所定义的条件相匹配的元素,并返回整个List 中第一个匹配元素的从零开始的索引。
List B = new List() { -5, 6, -7, 8 };
//查找集合B中元素绝对值大于6的元素个数
var x= B.FindIndex(o => Math.Abs(o) > 6);
14.ForEach 对 List 的每个元素执行指定操作。 GetEnumerator 返回循环访问 List 的枚举器。
List B = new List() { -5, 6, -7, 8 };
List A = new List();
//将集合B元素中大于0的数添加到集合A
B.ForEach(o =>
{
if(o>0)
{
A.Add(o);
}
});
15.Sort() 使用默认比较器对整个 List 中的元素进行排序。
16.Reverse() 将整个 List 中元素的顺序反转。
17.筛选一个集合类中想要的字段到另一个集合类:
//将集合peoples中的可用字段添加到集合teachers中
List teachers = peoples.Select(o => new Teacher
{
id = o.id,
Name = o.Name,
Age = o.Age,
TeachNum = 3
}).ToList();
//将集合peoples中的可用字段添加到匿名集合anonymous中
var anonymous= peoples.Select(o => new
{
id = o.id,
Name = o.Name
}).ToList();
18.将集合类中的字段拼接成一个字符串:
var QueryUsers = String.Join(",", users.ConvertAll(u => u.Name).ToArray());
队列:先进先出原则,一头进一头出,用Queue
Queue queue = new Queue();
//进列
queue.Enqueue("张三");
//出列
string out=queue.Dequeue();
栈:先进后出原则,同一边进出,用Stack
Stack stack = new Stack();
//进栈
stack.Push("张三");
//出栈
string out=stack.Pop();
链表: LinkedList是一个双向链表,链表有个有点,就是在链表中间插入、删除元素很快,但是查找中间与末尾的元素很慢,需要一个节点一个节点的去找。
LinkedList lList = new LinkedList();
LinkedListNode node = new LinkedListNode("root");
lList.AddFirst(node);
node = lList.AddAfter(node, "张三");
node = lList.AddAfter(node, "李四");
node = lList.AddAfter(node, "王五");
foreach (String item in lList)
{
Console.WriteLine("foreach迭代:" + item);
}
有序列表 :SortedList采用键-值对存储,键不能重复,并且会根据key进行排序
//Key必须唯一,如果不唯一可以考虑Lookup
SortedList sList = new SortedList();
sList.Add(100, "张三");
sList.Add(21, "李四");
sList.Add(13, "王五");
foreach (KeyValuePair item in sList)
{
Console.WriteLine("key=" + item.Key.ToString() + ";value=" + item.Value);
}
字典:允许通过key来查找值,字典可以自由添加、删除元素,没有集合由于移动元素导致的开销
//Key必须唯一
Dictionary dict = new Dictionary();
dict.Add(11, "张三");
dict.Add(1, "李四");
dict.Add(2, "王五");
foreach (KeyValuePair item in dict)
{
Console.WriteLine("key=" + item.Key.ToString() + ";value=" + item.Value);
}
有序字典,与有序列表对应;SortedDictionary,SortedList,SortedSet
集(Set):包含不重复元素,常用HashSet,SortedSet
HashSet hSet = new HashSet();
hSet.Add("张三");
hSet.Add("李四");
hSet.Add("王五");
foreach (String item in hSet)
{
Console.WriteLine("foreach迭代:" + item);
}
哈希表(Hashtable):Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。
Hashtable ht = new Hashtable();
ht.Add("1", "张三");
ht.Add("2", "李四");
ht.Add("3", "王五");
if (ht.ContainsValue("李四"))//判断 Hashtable 是否包含指定的值。
{
Console.WriteLine("李四");
}
// 获取键的集合
ICollection key = ht.Keys;
foreach (string k in key)
{
Console.WriteLine(k + ": " + ht[k]);
}
点阵列(BitArray):BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0)。当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。
// 创建两个大小为 8 的点阵列
BitArray ba1 = new BitArray(8);
BitArray ba2 = new BitArray(8);
byte[] a = { 60 };
byte[] b = { 13 };
// 把值 60 和 13 存储到点阵列中
ba1 = new BitArray(a);
ba2 = new BitArray(b);
// ba1 的内容
Console.WriteLine("Bit array ba1: 60");
for (int i = 0; i < ba1.Count; i++)
{
Console.Write("{0, -6} ", ba1[i]);
}
Console.WriteLine();
// ba2 的内容
Console.WriteLine("Bit array ba2: 13");
for (int i = 0; i < ba2.Count; i++)
{
Console.Write("{0, -6} ", ba2[i]);
}
Console.WriteLine();
集合的Linq使用参考:C# Linq介绍和使用_无熵~的博客-CSDN博客_c# linq
参考文档:
C#常用集合的使用 - 程序员大本营
https://www.jb51.net/article/190642.htm