翼度科技»论坛 编程开发 .net 查看内容

每个.NET开发都应掌握的C#集合知识点

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
上篇文章讲述了C#委托和事件知识点,本文将介绍C#集合知识点。作为.NET开发人员,C#集合是你在构建强大和高效应用程序时的关键技能之一。C#集合提供了一系列丰富的数据结构,可以帮助你更好地管理、操作和组织数据。本文将介绍一些每个.NET开发人员都应该掌握的C#集合知识点。
1、灵活的List
List.是.NET Framework 2.0跟随泛型推出的新特征,有了它之后,避免了ArryList数据类型装箱拆箱消耗的问题,它.NET中最常用的集合之一。它实现了动态数组的概念,允许你轻松地添加、删除和访问元素,而无需担心数组大小的限制。你可以使用索引来访问元素,还可以使用方法如Add、Remove和Insert来修改列表。案例如下:
  1. List<string> tasks = new List<string>();//string也可以换成属性类等
  2. tasks.Add("欢迎关注");
  3. tasks.Add("公众号");
  4. tasks.Add("公众号s");
  5. tasks.Add("DOTNET开发跳槽");
  6. tasks.Remove("公众号s");
  7. foreach (var item in tasks)
  8. {
  9.       Console.Write(item);
  10. }
复制代码
在try.dot.net的输出结果

2、完美的键值对Dictionary
Dictionary也是C#比较重要的集合之一。Dictionary 提供了一种用于存储键值对的高效方法。你可以根据键快速检索对应的值,如果你需要快速查找和映射数据,使用它效率杠杠的。它是构建缓存、映射和快速查找的理想选择。
案例如下:
  1. Dictionary<int, Student> studentDictionary = new Dictionary<int, Student>
  2. {
  3.      { 1, new Student("刘婵") },
  4.      { 2, new Student("关兴") },
  5.      { 3, new Student("张包") }
  6. };
  7. Student guanxing = studentDictionary[1]; // 通过ID查找学生
  8. Console.WriteLine(guanxing.Name);//输出结果:刘婵
  9. //声明的记录类型
  10. public record Student(string Name);
复制代码
3、避免重复的HashSet
HashSet 是一个无序、不重复的元素集合。它实现了 ICollection、IEnumerable 和 ISet 接口。HashSet 使用哈希表存储元素,因此可以快速查找元素。当你需要存储一组唯一的元素时,HashSet是个不错的选择。它确保不会有重复的值存在,这对于数据去重和集合操作非常有帮助。
案例如下:
  1. HashSet<int> likedPosts = new HashSet<int>();
  2. likedPosts.Add(101);
  3. likedPosts.Add(102);
  4. likedPosts.Add(101); // 重复元素不会被添加
  5. foreach (var item in likedPosts)
  6. {
  7.   Console.WriteLine(item);
  8. }
  9. bool alreadyLiked = likedPosts.Contains(101); // 检查是否已存在
复制代码
4、万能集合操作的LINQ
LINQ(语言集成查询)是为集合而生,它是.NET中的一项强大功能,它允许你在集合中执行各种查询和操作。通过使用 LINQ,你可以轻松地进行过滤、排序、映射等操作,而无需编写繁琐的循环代码。
这里就不举例了,大家可以看我的前一篇文章:每个.NET开发都应掌握的linq知识点
5、 多线程安全的选择“并发集合”
在.NET多线程应用程序中,需要主要集合线程安全地操作。.NET提供了一系列线程安全的集合,如 ConcurrentDictionary、ConcurrentQueue 和 ConcurrentStack。这些集合确保在多线程环境中操作数据时不会线程安全问题。
  1. ConcurrentDictionary<int, string> onlineUsers = new ConcurrentDictionary<int, string>();
  2. onlineUsers.TryAdd(1, "关注公众号");
  3. onlineUsers.TryAdd(2, "DOTNET开发跳槽");
  4. onlineUsers.TryAdd(3, "获取面试题");
  5. string user;
  6. bool found = onlineUsers.TryGetValue(2, out user); // 安全地访问数据
  7. if (found)
  8.      Console.WriteLine(user);
  9.  //输出:DOTNET开发跳槽
复制代码
6、C#自定义集合
在C#中,你可以根据需求创建自定义集合类型,以满足特定需求并提供更好的抽象和功能。下面是一个简单的示例,展示创建一个自定义的简单集合类。
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. // 自定义集合类
  5. public class MyCollection<T> : IEnumerable<T>
  6. {
  7.     private List<T> items = new List<T>();
  8.     // 添加元素
  9.     public void Add(T item)
  10. {
  11.         items.Add(item);
  12.     }
  13.     // 实现IEnumerable<T>接口的GetEnumerator方法
  14.     public IEnumerator<T> GetEnumerator()
  15.     {
  16.         return items.GetEnumerator();
  17.     }
  18.     // 实现非泛型IEnumerable接口的GetEnumerator方法
  19.     IEnumerator IEnumerable.GetEnumerator()
  20.     {
  21.         return GetEnumerator();
  22.     }
  23. }
  24. class Program
  25. {
  26.     static void Main(string[] args)
  27. {
  28.         MyCollection<string> srts = new MyCollection<string>();
  29.         srts.Add("刘邦");
  30.         srts.Add("项羽");
  31.         srts.Add("秦二");
  32.         foreach (var item in srts)
  33.         {
  34.             Console.WriteLine(item);
  35.         }
  36.     }
  37. }
复制代码
在try.dot.net的输出结果

7、集合与IEnumerable
C#中IEnumerable 接口与集合有紧密的关系。它是一个定义了一组元素的序列,可以被遍历的接口。虽然 IEnumerable 自身并不是集合类型,但是它是许多集合类型的基础接口,包括数组、列表、字典等。
IEnumerable 接口定义了一个方法 GetEnumerator(),它返回一个用于遍历序列的迭代器(IEnumerator)。迭代器提供了一个方式来逐个访问序列中的元素,而不需要暴露集合的内部实现细节。
从这个角度来看,集合类型可以看作是实现了 IEnumerable 接口的类的一种特殊形式。这意味着,如果你的类实现了 IEnumerable 接口,那么你就可以使用 foreach 循环来遍历这个类的实例。
8、集合的三种类型
集合通过它们的命名空间可以分为以下三类:
1)System.Collections.Generic 类
System.Collections.Generic 命名空间中的类提供了通用的泛型集合类型。这些集合在性能和类型安全性方面通常都比非泛型的 System.Collections 类更好。
一些常见的 System.Collections.Generic 类:
List、Dictionary、HashSet
LinkedList(双向链表,适用于插入和删除操作较多的场景。)
Queue 和 Stack(队列和栈)
2)System.Collections.Concurrent 类
System.Collections.Concurrent 命名空间中的类提供了线程安全的集合,适用于多线程环境下的并发操作。这些集合在多线程应用中能够提供更好的性能和可靠性。
一些常见的 System.Collections.Concurrent 类:
ConcurrentDictionary:线程安全的键值对集合。
ConcurrentQueue:线程安全的队列,用于先进先出的数据处理。
ConcurrentStack:线程安全的栈,用于后进先出的数据处理。
3)System.Collections 类
System.Collections 命名空间中的类是 .NET Framework 中早期的集合实现,它们不是泛型的,并且性能相对较低。然而,由于历史原因和向后兼容性,它们仍然在代码中使用。
一些常见的System.Collections 类:
ArrayList、Hashtable、Queue 和 Stack
结语
以上只列出了部分C#集合的详解,C#中还有最基本的数组类型、Queue 和 Stack(队列和栈)、过时的ArryList和hashtable等、感兴趣大家可以去研究一下。C#集合是.NET开发中不可或缺的一部分,有了它们处理数据变得更加容易。通过掌握这些集合知识点,你可以更好地组织和操作数据,编写出更具可读性和性能的代码。
希望本文对你有所收获,对于C#集合的知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。
参考:
1、微软官方文档 :
learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/collections
2、chatgpt
  1. 来源公众号:DotNet开发跳槽
复制代码
来源:https://www.cnblogs.com/xbhp/archive/2023/09/04/17676603.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具