C#中的集合是用于存储和操作一组相关数据的数据结构C#提供了泛型集合和非泛型集合两种类型。
命名空间:
非泛型集合 System.Collections
泛型集合 System.Collections.Generic
列表和字典中分泛型集合与非泛型集合。
列表中非泛型集合为ArrayList,泛型集合为List<T>。字典中非泛型集合为Hashtable,泛型集合为Dictionary<TKey, TValue>。栈中非泛型集合为Stack,泛型集合为Stack<T>;队列中非泛型集合为Quene,泛型集合为Quene<T>;对于列表存取和输出都是有序的,字典的存取和输出都是无序的,栈中数据先进后出,队列中数据先进先出。
1.非泛型集合:
非泛型集合使用Object类型来存储元素。常见的非泛型集合有ArrayList、Hashtable,栈Stack,队列Quene等。
ArrayList是一种动态数组,它可以根据需要自动调整大小。它可以存储任意类型的对象,并且可以通过索引访问和操作元素。ArrayList提供了一系列方法来添加、删除、查找和修改元素,使得对列表的操作更加方便。
Hashtable是一种键值对存储结构,也被称为哈希表。它使用键来访问和存储值,通过将键映射到哈希表中的位置来实现快速的查找和插入操作。Hashtable中的键和值都可以是任意类型的对象。它提供了一系列方法来添加、删除、查找和修改键值对,使得对哈希表的操作更加方便。
Stack是一种后进先出(Last In First Out, LIFO)的数据结构,意味着最后添加的元素将是第一个被移除的元素。压栈push()添加元素;弹栈Pop(),读取并移除顶部对象;Peek()读栈顶 读取但不移除对象
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///summary
///字典(Hashtable) 非泛型
///summary
public class HashtableText : MonoBehaviour
{
private Hashtable table = new Hashtable(); //非泛型
void Start()
{
table.Add("姓名", "Kami");
table.Add("Sex", "Boy");
table.Add("Age", 18);
foreach (string item in table.Keys)
{
print("键:" + item +" "+ "值:" + table[item]);
}
foreach (string item in table.Values)
{
print("值:" + item);
}
}
定义非泛型集合的方式如下:
//列表
ArrayList list = new ArrayList();
list.Add("CSDN");
list.Add(2021);
//字典Hashtable
Hashtable table=new Hashtable();
table.Add("姓名", "Kami");
table.Add("Sex", "Boy");
table.Add("Age", 18);
//栈Stack
//Stack(先进后出)泛型集合定义格式
Stack<String> stack = new Stack<>();
stack.push("Hello");
stack.push("World");
String poppedElement = stack.pop();
//队列Quene
Queue queue = new LinkedList();
queue.Enqueue("Kami"); //入队
queue.Enqueue(20);
print(queue.Dequeue()); //出队
print(queue.Peek()); //读队首
非泛型缺点:
1.性能不好,因为可能发生装箱。
2.类型不安全,可能会发生类型转换的异常。
3.使用不方便,用的时候需要手动做类型转换。
由于使用了Object类型,需要进行装箱和拆箱操作,会带来性能损耗。同时,编译器无法在编译时进行类型检查,容易引发类型转换错误。
优点:可以存储不同类型的元素,灵活性较高。
2.泛型集合
泛型集合使用泛型类型参数来指定存储的元素类型。常见的泛型集合有List<T>、Dictionary<TKey, TValue>等。
`List<T>` 和 `Dictionary<TKey, TValue>` 它们分别用于存储集合和键值对数据。
1. **List<T>**:这是一个泛型集合,用于存储一个对象的有序集合。在这个集合中,每个元素都是同一类型的对象,这个类型在声明 List 时使用尖括号 `<>` 指定。例如,`List<string>` 用于存储字符串的集合,`List<int>` 用于存储整数的集合。`List<T>` 提供了许多方法来添加、删除、查找和访问集合中的元素,例如 `Add`、`Remove`、`Find` 和 `ForEach` 等。
List<int> numbers = new List<int>();
numbers.Add(1); // 添加元素
numbers.Add(2);
numbers.Add(3);
int firstNumber = numbers[0]; // 访问第一个元素
2. **Dictionary<TKey, TValue>**:这是一个泛型键值对集合,用于存储键值对的无序集合。在这个集合中,每个元素都是一个键(Key)和一个值(Value)的对应关系。键和值可以是不同的类型,它们在声明 Dictionary 时分别用两个尖括号指定。`Dictionary<TKey, TValue>` 提供了快速的查找、添加和删除键值对的能力,常用的方法有 `Add`、`Remove`、`TryGetValue` 和 `ContainsKey` 等。
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 25); // 添加键值对
ages.Add("Bob", 30);
int age;
if (ages.TryGetValue("Alice", out age)) // 尝试获取键对应的值
{
Console.WriteLine("Alice is " + age + " years old.");
}
这两种数据结构都是.NET Framework中的System.Collections.Generic命名空间下的一部分,广泛应用于各种类型的应用程序中,以便于开发者能够有效地管理和操作数据集合。
定义泛型集合的方式如下:
//List<T> 列表
List<string> list = new List<string>();
list.Add("CSDN");
list.Add("2021");
//Dictionary<Tkey,Tvalue> 字典
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 25); // 添加键值对
ages.Add("Bob", 30);
int age;
if (ages.TryGetValue("Alice", out age)) // 尝试获取键对应的值
{
Console.WriteLine("Alice is " + age + " years old.");
}
//Stack<T> 栈
Deque<String> stack = new ArrayDeque<>();
stack.push("Hello");
stack.push("World");
String poppedElement = stack.pop();
//Quene<T> 队列
Queue<String> queue = new LinkedList<>();
queue.Enqueue("Kami"); //入队
queue.Enqueue("90");
print(queue.Dequeue()); //出队
print(queue.Peek()); //读队首
- 优点:由于使用了泛型类型参数,可以在编译时进行类型检查,提高了代码的安全性和性能。
- 缺点:只能存储指定类型的元素,不具备存储不同类型元素的灵活性。