20250606-C#知识:泛型与非泛型容器的基本操作
C#知识:泛型与非泛型容器的基本操作
这里介绍一下C#中几种常用的容器创建和增删改查。
1、有关容器的接口和类关系图
1.1 非泛型集合接口继承关系
1.2 非泛型集合类实现关系
1.3 泛型集合接口继承关系
1.4 泛型集合类实现关系
2、非泛型容器
- using System.Collections;
- 内部为Object类型,存在装箱拆箱
2.1 ArrayList动态数组
- 一个能自动扩容的动态数组
- 注意Remove方法只会删除第一个匹配的元素
ArrayList arrayList = new ArrayList();
//增
arrayList.Add(1);
arrayList.Add("23");
arrayList.Add(4.0f);
arrayList.Add(5);
arrayList.Add(6);
arrayList.Add(6);
arrayList.Add(true);
arrayList.Add(true);
arrayList.Insert(2, "GO ");
//删
arrayList.Remove("23");
arrayList.RemoveAt(0);
//改
arrayList[0] = "KFC";
//查
Console.WriteLine(arrayList.Contains(6)); //True
Console.WriteLine(arrayList.IndexOf(5)); //2
Console.WriteLine(arrayList.IndexOf(9)); //-1
Console.WriteLine(arrayList.LastIndexOf(true)); //6
Console.WriteLine(arrayList.Count); //7
Console.WriteLine(arrayList.Capacity); //16arrayList.Insert(4, 9);
//遍历
for (int i = 0; i < arrayList.Count; i++)
{Console.Write(arrayList[i] + " ");
}
Console.WriteLine(); //KFC 4 5 6 9 6 True TruearrayList.Remove(6); //只删除第一个6
//迭代器遍历
foreach(object item in arrayList)
{Console.Write(item + " ");
}
Console.WriteLine(); //KFC 4 5 9 6 True True
2.2 非泛型栈Stack
- 后进先出
//非泛型栈创建
Stack stack = new Stack();//增
stack.Push(1);
stack.Push(2);
stack.Push(3);
stack.Push(4);
stack.Push(5);//删
object topValue = stack.Pop();
Console.WriteLine(topValue); //5//查
//查看栈顶元素
Console.WriteLine(stack.Peek()); //4
//查看栈是否包含元素
Console.WriteLine(stack.Contains(3)); //True//迭代器遍历
Console.WriteLine(stack.Count); //4
foreach (object item in stack)
{Console.Write(item + " ");
}
Console.WriteLine(); //4 3 2 1//将栈转换为数组遍历
object[] objects = stack.ToArray();
for(int i = 0;i < objects.Length;i++)
{Console.Write(objects[i] + " ");
}
Console.WriteLine(); //4 3 2 1
2.3 非泛型队列Queue
- 先进先出
//创建
Queue queue = new Queue();
Queue<int> queue2 = new Queue<int>();//增
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
queue.Enqueue(4);
queue.Enqueue(5);
queue.Enqueue(6);//删
Console.WriteLine(queue.Dequeue()); //1//查
Console.WriteLine(queue.Peek()); //2
Console.WriteLine(queue.Contains(4)); //True//遍历类似栈,从头到尾遍历
foreach (object item in queue)
{Console.Write(item + " ");
}
Console.WriteLine(); //2 3 4 5 6
2.4 HashTable
- 存放键值对
//创建
Hashtable hashtable = new Hashtable();
//增
hashtable.Add("v50", "KFC");
hashtable.Add("天王盖地虎", "宝塔镇河妖");
hashtable.Add("Damage", 100);
hashtable.Add(1, 3017);
//删
//根据键来删除,如果键不存在则取消删除操作
hashtable.Remove("Damage");//改
hashtable["v50"] = "UFO";//查
Console.WriteLine(hashtable["天王盖地虎"]); //宝塔镇河妖
Console.WriteLine(hashtable.Contains(1)); //True
Console.WriteLine(hashtable.ContainsKey(1)); //True
Console.WriteLine(hashtable.ContainsValue(1)); //False//遍历
//通过键遍历
foreach (object item in hashtable.Keys)
{Console.Write("(" +item + " , ");Console.Write(hashtable[item] + ") ");
}
Console.WriteLine(); //(天王盖地虎 , 宝塔镇河妖) (v50 , UFO) (1 , 3017)//遍历所有值
foreach (object item in hashtable.Values)
{ Console.Write($"{item} ");
}
Console.WriteLine(); //宝塔镇河妖 UFO 3017//遍历键值对
foreach (DictionaryEntry item in hashtable)
{Console.Write($"({item.Key} , ");Console.Write($"{item.Value}) ");
}
Console.WriteLine(); //(天王盖地虎 , 宝塔镇河妖) (v50 , UFO) (1 , 3017)//通过迭代器进行遍历
IDictionaryEnumerator dictionaryEnumerator = hashtable.GetEnumerator();
while(dictionaryEnumerator.MoveNext())
{Console.Write($"({dictionaryEnumerator.Key} , ") ;Console.Write($"{dictionaryEnumerator.Value}) ") ;
}
Console.WriteLine(); //(天王盖地虎 , 宝塔镇河妖) (v50 , UFO) (1 , 3017)
3、泛型容器
3.1 泛型数组List
- 方法类似于ArrayList
List<int> list = new List<int>();
3.2 泛型字典Dictionary
- 方法类似于HashTable
Dictionary<string, int> dictionary = new Dictionary<string, int>();
3.3 泛型栈
- 方法类似于非泛型栈
Stack<int> stack2 = new Stack<int>();
3.4 泛型队列
- 方法类似非泛型队列
Queue<int> queue2 = new Queue<int>();
3.5 双向链表LinkedList
- 增删快,查改慢
- 能访问某个节点的前置和后置
LinkedList<int> myLinkedList = new();
//增
myLinkedList.AddLast(5);
myLinkedList.AddFirst(4);
myLinkedList.AddFirst(3);
myLinkedList.AddFirst(1);LinkedListNode<int> node1 = myLinkedList.Find(3);
myLinkedList.AddBefore(node1, 2);
LinkedListNode<int> node2 = myLinkedList.Find(5);
myLinkedList.AddAfter(node2, 6);
//删
myLinkedList.RemoveFirst();
myLinkedList.RemoveLast();
myLinkedList.Remove(3);
//改
myLinkedList.First.Value = 9;
myLinkedList.Find(4).Value = 8;//遍历
LinkedListNode<int> currentNode = myLinkedList.First;
while(currentNode != null)
{Console.Write($"{currentNode.Value} ");currentNode = currentNode.Next;
}
Console.WriteLine(); //9 8 5
4、参考资料
- 《唐老狮C#》
本篇结束,感谢您的阅读~