C# 数组与集合应用场景使用总结

数组:相同数据类型的元素按一定顺序排列的集合,值类型数据。

        优点:数组在存储数据的时候是连续存储的,因此可以快速而容易地从头到尾遍历元素,可以快速的修改元素等等。
        缺点:在声明数组的时候必须先声明指定的长度。如果事先不知道存储的大小,很容易会造成声明的长度过长导致内存空间浪费,过短则造成数据的溢出。而且在两个数据中间插入数据也是非常麻烦的,需要将插入位置后面的数组全部移动位置。


集合:是命名空间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

你可能感兴趣的:(C#,c#,开发语言)