前言
在 C# 中,集合可以分泛型集合和非泛型集合两种主要类型。两种集合类型在类型、安全性、可用性和性能特征等方面有所不同。而在大多数情况下,建议使用泛型集合,因为它执行速度比非泛型集合快,并且通过提供编译时错误来最大限度地减少异常。本文了解泛型和非泛型集合两种类型的概述。
泛型集合
1、概述
泛型集合类型可以用来储存任何类型的数据,由 Collections.Generic 命名空间提供。
HashSet<string> hashSet = new HashSet<string>();List<int> numbers = new List<int>();
2、特征
提供强大的类型安全性,在声明元素时,允许指定包含的元素类型。类型的安全性在编译时强制执行,以防止与类型相关的运行时错误。
在从集合中检索元素时无需显式强制转换,对使用者更友好,在编码时,可以使用强类型元素,使代码更具可读性且不易出错。
避免装箱和取消装箱的开销,使得在执行速度和内存使用方面都更有效。为值类型提供了更好的性能,并且在检索元素时不需要强制转换。
3、示例
// 定义数字列表List<int> numbers = new List<int>();// 使用 Add 方法添加元素numbers.Add(1);numbers.Add(3);// 输出列表元素for (int i = 0; i < numbers.Count; i++){ Console.WriteLine(numbers[i]);}// 定义客户对象列表var customers = new List<Customer>() { new Customer(){ Code = "Haiwei", Name="华为"}, new Customer(){ Code = "Xiaomi", Name="小米"},};// 输出列表元素foreach (var customer in customers){ Console.WriteLine(customer.Code);}
public class Customer{ public string Code { get; set; }
public string Name { get; set; }}
// 定义字典Dictionary<string, int> dictionary = new Dictionary<string, int>();// 添加元素dictionary.Add("Xiaomi", 50);// 遍历元素foreach (KeyValuePair<string, int> dict in dictionary){ Console.WriteLine(dict.Key);}Console.WriteLine(dictionary["Xiaomi"]);
// 定义字符串队列Queue<string> queues = new Queue<string>();// 添加元素queues.Enqueue("A001");queues.Enqueue("A002");// 遍历元素foreach (string queue in queues){ Console.WriteLine(queue);}
// 定义字符串无序集HashSet<string> languages = new HashSet<string>();// 添加元素languages.Add("English");languages.Add("Simplified");languages.Add("Traditional");// 遍历元素foreach (var language in languages){ Console.WriteLine(language);}
// 定义整数链表LinkedList<int> linkedList = new LinkedList<int>();// 添加元素linkedList.AddLast(11);linkedList.AddFirst(12);// 判断元素if (linkedList.Contains(11)){ Console.WriteLine("链表中存在11");}// 遍历元素foreach (int item in linkedList){ Console.WriteLine(item);}
// 定义字符串堆栈Stack<string> stacks = new Stack<string>();// 添加元素stacks.Push("one");stacks.Push("two");// 遍历元素foreach (string stack in stacks){ Console.WriteLine(stack);}
非泛型集合
1、概述
非泛型集合主要用于存储多种类型的对象,具有较高的灵活性,但性能和类型安全性较差。由 System.Collections 命名空间提供。
ArrayList list = new ArrayList();Hashtable hashtable = new Hashtable();
2、特征
非泛型集合将元素存储为对象类型,并且在检索元素时通常需要显式强制转换,因此它不是类型安全的。与类型相关的错误只能在运行时发现。
在处理元素时涉及强制转换和装箱/取消装箱操作,由于强制转换会使代码的可读性降低且更容易出错,从而降低其可用性。
由于存在装箱和取消装箱,使得非泛型集合可能会产生性能开销,可能会导致性能下降,尤其在使用值类型。
3、示例
// 定义非泛型动态数组ArrayList arrayLists = new ArrayList();// 添加整数元素arrayLists.Add(1);// 添加字符串元素arrayLists.Add("A");// 添加布尔值元素arrayLists.Add(true);// 遍历元素for (int i = 0; i < arrayLists.Count; i++){ Console.WriteLine(arrayLists[i]);}
// 定义哈希表Hashtable hashtable = new Hashtable();// 添加A键值为 1hashtable.Add("A", 1);// 添加B键值为 truehashtable.Add("B", true);// 添加C键值为 C0001hashtable.Add("C", "C0001");// 遍历元素foreach (DictionaryEntry entry in hashtable){ Console.WriteLine(entry.Value );}// 移除元素hashtable.Remove("A");
// 定义非泛型队列Queue queues = new Queue();// 添加元素queues.Enqueue(1);queues.Enqueue("A001");queues.Enqueue(2);queues.Enqueue("A002");
// 定义非泛型堆栈Stack stacks = new Stack();// 添加元素stacks.Push("A");stacks.Push(1);stacks.Push(true);
// 输出 true 时会报异常 无法将类型为“System.Boolean”的对象强制转换为类型“System.String”foreach (string stack in stacks){ Console.Write(stack);}
// 定义非泛型排序列表SortedList sortedLists = new SortedList();// 添加元素nsortedLists.Add("001", "Haiwei");nsortedLists.Add("002", "Xiaomi");// 判断元素if (sortedLists.ContainsValue("Haiwei")){ Console.WriteLine("值已存在");}else{ sortedLists.Add("003", "Haiwei");}// 遍历元素foreach (string sortedList in sortedLists.Keys){ Console.WriteLine(sortedList);}
小结
与非泛型集合相比,C# 中的泛型集合在类型安全性、性能和易用性方面具有显著优势。在大多数情况下,建议使用泛型集合为首选方案。
该文章在 2024/11/15 11:21:53 编辑过