西安网站建设个人,一墨设计公司,做博客网站需要工具吗,企业网站管理系统c1.泛型1.ArrayList 与 ListT的不同点特性ArrayList (System.Collections)ListT (System.Collections.Generic)类型安全非泛型#xff0c;存储 object 类型泛型#xff0c;编译时类型检查性能需要装箱/拆箱操作#xff0c;性能较低无需装箱/拆箱#xff0c;…1.泛型1.ArrayList 与 ListT的不同点特性ArrayList (System.Collections)ListT (System.Collections.Generic)类型安全非泛型存储 object 类型泛型编译时类型检查性能需要装箱/拆箱操作性能较低无需装箱/拆箱性能更高内存使用可能更多存储 object 引用更高效直接存储值类型引入版本.NET 1.0.NET 2.0 (引入泛型后)排序/查找需要自定义比较器支持类型特定的比较线程安全非线程安全非线程安全推荐使用场景遗留代码需要混合类型存储现代代码类型明确的集合ArrayList: 本质是一个 object[] 数组。存取值类型如 int时需要进行装箱和拆箱不仅消耗性能还容易在转换时抛出异常。ListT: 也就是泛型列表编译器会为具体类型生成专用代码。它是 C# 开发的首选。2.ListTA. 创建ListListint numbers new Listint(); // 空列表 Liststring names new Liststring() { Alice, Bob, Charlie }; // 初始化列表 Listdouble values new Listdouble(10); // 指定初始容量ListT 提供了比数组更丰富的方法且底层自动处理扩容通常由 0 - 4 - 8 - 16 倍增。B. 增删改查Liststring names new Liststring { 张三, 李四 }; // 添加 names.Add(王五); // 单个 names.AddRange(new[] { A, B }); // 批量 // 插入 names.Insert(1, 赵六); // 在索引1插入 // 删除 names.Remove(李四); // 按值删 names.RemoveAt(0); // 按索引删 names.RemoveAll(n n.Length 5); // 按条件删 (Lambda) // 查找 bool exists names.Contains(张三); string found names.Find(n n.StartsWith(A)); // 返回第一个匹配项 Liststring allFound names.FindAll(n n.Length 1); // 返回所有匹配项C. 常用方法int count numbers.Count; // 获取元素数量 bool contains numbers.Contains(3); // 检查是否包含 int index numbers.IndexOf(3); // 查找索引 numbers.Insert(1, 5); // 在指定位置插入 numbers.Remove(3); // 移除指定元素 numbers.RemoveAt(0); // 移除指定位置的元素 numbers.Clear(); // 清空列表D. 排序 (Sort)ListT.Sort 非常强大支持多种排序方式1. 默认排序: 元素需实现 IComparableT。2. 自定义比较器: 实现 IComparerT 接口。students.Sort((x, y) { // 返回值含义0 (x在前), 0 (相等), 0 (y在前) return y.Age - x.Age;E. 遍历// foreach 循环 foreach (int num in numbers) { Console.WriteLine(num); } // for 循环 for (int i 0; i numbers.Count; i) { Console.WriteLine(numbers[i]); }F. 类型转换ListT 提供了方便的转换方法1. ToArray(): 转为数组。2. ConvertAllTOutput: 将 List 转换为另一种类型的 List。例题:需求如下:定义一个产品Product类定义产品name名称价格Price字段并用属性进行封装定义一个产品集合用来存放5个产品。通过循环的方式用Console.ReaderLine()接受5个产品的信息。通过循环打印集合中所有产品的信息。 产品名称XXX 价格YYYY计算集合中所有产品的总金额和平均价格打印集合中价格低于10的商品信息将集合中价格超过100的商品从集合中删除internal class Program { static void Main(string[] args) { ListProduct products new ListProduct(); for (int i 0; i 5; i) { Console.WriteLine($请输入第{i 1}个商品的信息); Console.Write(请输入商品名字); string name Console.ReadLine(); double price; while (true) { Console.Write(请输入商品价格); if (double.TryParse(Console.ReadLine(), out price) price0) { break; } Console.WriteLine(请输入正整数); } Product pro new Product(name, price); products.Add(pro); } Console.WriteLine(商品信息); foreach (var pro in products) { Console.WriteLine($产品名称{pro.Name}\t价格{pro.Price}); } double totalAmount 0; foreach (var pro in products) { totalAmount pro.Price; } double avgPrice totalAmount / products.Count; Console.WriteLine($总金额{totalAmount}); Console.WriteLine($平均价格{avgPrice}); Console.WriteLine( 价格低于10的商品 ); ListProduct lowPriceProducts products.FindAll(pro pro.Price 10); foreach (var pro in lowPriceProducts) { Console.WriteLine($产品名称{pro.Name}\t价格{pro.Price}); } Console.WriteLine( 删除价格超过100的商品 ); int removedCount products.RemoveAll(pro pro.Price 100); foreach (var pro in products) { Console.WriteLine($产品名称{pro.Name} 价格{pro.Price}); } } }internal class Product { private string _name; private double _price; public string Name { get _name; set _name value; } public double Price { get _price; set _price value; } public Product(string name,double price) { _name name; _price price; } }2.字典1.Hashtable与DictionaryK,V的区别特性HashtableDictionaryTKey, TValue类型安全❌ 非泛型✔️ 泛型线程安全✔️ 是但性能低❌ 否但性能高性能较慢装箱拆箱更快无装箱拆箱空值支持Key 不能为null取决于TKey/TValue迭代顺序不保证.NET Core 保留插入顺序推荐使用已过时不推荐新代码使用现代代码首选Hashtable:1. Key 和 Value 都是 object。2. 底层: 使用开放寻址法处理哈希冲突。3. 遍历: 无序插入顺序与遍历顺序无关。4. 线程安全: 提供 Synchronized 包装器但效率低。DictionaryK,V:1. Key 和 Value 是强类型。2. 底层: 使用拉链法处理哈希冲突Bucket数组 Entry链表。3. 性能: 查找时间复杂度接近 O(1)。4.遍历: .NET Core 以后版本保留了插入顺序。2.DictionaryK,V概念DictionaryK, V是.NET框架中的泛型集合类属于System.Collections.Generic命名空间。它以键值对的形式存储数据每个键必须唯一但值可以重复。特征:类型安全通过泛型避免装箱拆箱操作高效查找基于哈希表实现平均O(1)时间复杂度动态扩容容量不足时自动扩展键唯一性确保每个键在字典中只出现一次A. 创建DictionaryK,V// 基本声明与实例化 Dictionarystring, int dict1 new Dictionarystring, int(); // 集合初始化器 (C# 3.0) Dictionarystring, int dict2 new Dictionarystring, int { { 张三, 18 }, { 李四, 23 } }; // 索引器初始化 (C# 6.0) Dictionarystring, int dict3 new Dictionarystring, int { [张三] 18, [李四] 23 }; // 指定初始容量优化性能 Dictionarystring, int dict4 new Dictionarystring, int(100);B. 添加与访问Dictionarystring, int scores new Dictionarystring, int(); // 添加 (Add方法如果键已存在会抛异常) scores.Add(张三, 90); // 索引器 (推荐如果键不存在则添加存在则修改) scores[李四] 85; scores[李四] 88; // 修改 李四 的分数为 88 // 安全查找 (TryGetValue - 最常用模式) if (scores.TryGetValue(张三, out int score)) { Console.WriteLine($张三的成绩是: {score}); } else { Console.WriteLine(没有找到Key); }C. 修改与删除// 修改值 scores[张三] 78; // 删除指定键 bool removed scores.Remove(李四); // 删除并获取值 需要在.Net Core中使用 if (scores.Remove(张三, out int zhangsan)) { Console.WriteLine($已删除Charlie年龄: {zhangsan}); } // 清空字典 scores.Clear();D. 遍历注意在 foreach 遍历过程中绝对不能修改字典添加或删除元素否则会抛出异常。// 遍历键值对 foreach (KeyValuePairstring, int kvp in scores) { Console.WriteLine(${kvp.Key}: {kvp.Value}); } // 简化写法 foreach (var kvp in scores) { Console.WriteLine(${kvp.Key}: {kvp.Value}); } // 只遍历键 foreach (string name in scores.Keys) { Console.WriteLine(name); } // 只遍历值 foreach (int a in scores.Values) { Console.WriteLine(a); }例题:创建Directory集合存放学员姓名和年龄向字典中手动添加多个学员信息在控制台上接受学员姓名从集合中查找学员对应年龄并打印再根据学员姓名从集合中删除学员信息打印剩下的所有学员姓名和年龄internal class Program { static void Main(string[] args) { Dictionarystring, int student new Dictionarystring, int(); student.Add(张三, 18); student.Add(李四, 23); student.Add(王五, 17); student.Add(赵六, 26); Console.WriteLine(请输入学员姓名); string name Console.ReadLine(); if (student.ContainsKey(name)) { Console.WriteLine(${name}的年龄是{student[name]}); } else { Console.WriteLine(未找到相关学员); } Console.WriteLine(选择要删除的学员信息名称); string deletename Console.ReadLine(); if (student.ContainsKey(deletename)) { student.Remove(deletename); } else { Console.WriteLine(未找到相关学员); } Console.WriteLine(学生信息展示); foreach (KeyValuePairstring, int kvp in student) { Console.WriteLine($姓名{kvp.Key}年龄{kvp.Value}); } } }3. 学习总结1. 首选泛型:优先使用 ListT 和 DictionaryK,V。只有在维护极老的 .NET Framework 1.x 代码时才考虑 ArrayList 或 Hashtable。2.安全读写:使用 TryGetValue 来获取字典值避免异常。使用 ContainsKey 在添加前检查如果使用 Add。3. 性能优化:创建集合时若能预估数量请在构造函数中指定数量。自定义对象作为 Dictionary 的 Key 时必须正确重写 GetHashCode() 和 Equals() 方法。4.遍历修改:如果需要一边遍历一边删除元素请先使用 .ToList() 复制一份 Key 列表或者使用 for 倒序循环针对 List。