C#集合

C#集合提供了一系列丰富的数据结构,可以帮助你更好地管理、操作和组织数据。

1、灵活的List<T>

List<T>.是.NET Framework 2.0跟随泛型推出的新特征,有了它之后,避免了ArryList数据类型装箱拆箱消耗的问题,它.NET中最常用的集合之一。它实现了动态数组的概念,允许你轻松地添加、删除和访问元素,而无需担心数组大小的限制。你可以使用索引来访问元素,还可以使用方法如Add、Remove和Insert来修改列表。

List<string> tasks = new List<string>();//string也可以换成属性类等
tasks.Add("欢迎关注");
tasks.Add("公众号1");
tasks.Add("公众号2");
tasks.Add("公众号3");
tasks.Remove("公众号2");
foreach (var item in tasks)
{
      Console.Write(item);
}

2、完美的键值对Dictionary<TKey, TValue>

Dictionary也是C#比较重要的集合之一。Dictionary<TKey, TValue> 提供了一种用于存储键值对的高效方法。你可以根据键快速检索对应的值,如果你需要快速查找和映射数据,使用它效率杠杠的。它是构建缓存、映射和快速查找的理想选择。

 Dictionary<int, Student> studentDictionary = new Dictionary<int, Student>
 {
     { 1, new Student("刘兴") },
     { 2, new Student("关包") },
     { 3, new Student("张婵") }
 };
 Student guanxing = studentDictionary[1]; // 通过ID查找学生
Console.WriteLine(guanxing.Name);//输出结果:刘兴
//声明的记录类型
public record Student(string Name);

3、避免重复的HashSet<T>

HashSet 是一个无序、不重复的元素集合。它实现了 ICollection<T>、IEnumerable<T> 和 ISet<T> 接口。HashSet 使用哈希表存储元素,因此可以快速查找元素。当你需要存储一组唯一的元素时,HashSet<T>是个不错的选择。它确保不会有重复的值存在,这对于数据去重和集合操作非常有帮助。

HashSet<int> likedPosts = new HashSet<int>();
likedPosts.Add(101);
likedPosts.Add(102);
likedPosts.Add(101); // 重复元素不会被添加

foreach (var item in likedPosts)
{
  Console.WriteLine(item);
}
bool alreadyLiked = likedPosts.Contains(101); // 检查是否已存在

4、万能集合操作的LINQ

LINQ(语言集成查询)是为集合而生,它是.NET中的一项强大功能,它允许你在集合中执行各种查询和操作。通过使用 LINQ,你可以轻松地进行过滤、排序、映射等操作,而无需编写繁琐的循环代码。

5、 多线程安全的选择“并发集合”

在.NET多线程应用程序中,需要主要集合线程安全地操作。.NET提供了一系列线程安全的集合,如 ConcurrentDictionary<TKey, TValue>、ConcurrentQueue<T> 和 ConcurrentStack<T>。这些集合确保在多线程环境中操作数据时不会线程安全问题。

 ConcurrentDictionary<int, string> onlineUsers = new ConcurrentDictionary<int, string>();
 onlineUsers.TryAdd(1, "关注公众号1");
 onlineUsers.TryAdd(2, "关注公众号2");
 onlineUsers.TryAdd(3, "关注公众号3");
 string user;
 bool found = onlineUsers.TryGetValue(2, out user); // 安全地访问数据
 if (found)
     Console.WriteLine(user);

6、C#自定义集合

在C#中,你可以根据需求创建自定义集合类型,以满足特定需求并提供更好的抽象和功能。下面是一个简单的示例,展示创建一个自定义的简单集合类。

using System;
using System.Collections;
using System.Collections.Generic;

// 自定义集合类
public class MyCollection<T> : IEnumerable<T>
{
    private List<T> items = new List<T>();
    // 添加元素
    public void Add(T item)
{
        items.Add(item);
    }
    // 实现IEnumerable<T>接口的GetEnumerator方法
    public IEnumerator<T> GetEnumerator()
    {
        return items.GetEnumerator();
    }
    // 实现非泛型IEnumerable接口的GetEnumerator方法
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
class Program
{
    static void Main(string[] args)
{
        MyCollection<string> srts = new MyCollection<string>();
        srts.Add("刘邦");
        srts.Add("项羽");
        srts.Add("秦二");
        foreach (var item in srts)
        {
            Console.WriteLine(item);
        }
    }
}

7、集合与IEnumerable<T>

C#中IEnumerable<T> 接口与集合有紧密的关系。它是一个定义了一组元素的序列,可以被遍历的接口。虽然 IEnumerable<T> 自身并不是集合类型,但是它是许多集合类型的基础接口,包括数组、列表、字典等。

IEnumerable<T> 接口定义了一个方法 GetEnumerator(),它返回一个用于遍历序列的迭代器(IEnumerator<T>)。迭代器提供了一个方式来逐个访问序列中的元素,而不需要暴露集合的内部实现细节。

从这个角度来看,集合类型可以看作是实现了 IEnumerable<T> 接口的类的一种特殊形式。这意味着,如果你的类实现了 IEnumerable<T> 接口,那么你就可以使用 foreach 循环来遍历这个类的实例。

8、集合的三种类型

集合通过它们的命名空间可以分为以下三类:

1)System.Collections.Generic 类

System.Collections.Generic 命名空间中的类提供了通用的泛型集合类型。这些集合在性能和类型安全性方面通常都比非泛型的 System.Collections 类更好。

一些常见的 System.Collections.Generic 类:List<T>、Dictionary<TKey, TValue>、HashSet<T>LinkedList<T>(双向链表,适用于插入和删除操作较多的场景。)Queue<T> 和 Stack<T>(队列和栈)

2)System.Collections.Concurrent 类

System.Collections.Concurrent 命名空间中的类提供了线程安全的集合,适用于多线程环境下的并发操作。这些集合在多线程应用中能够提供更好的性能和可靠性。

一些常见的 System.Collections.Concurrent 类:
ConcurrentDictionary<TKey, TValue>:线程安全的键值对集合。
ConcurrentQueue<T>:线程安全的队列,用于先进先出的数据处理。
ConcurrentStack<T>:线程安全的栈,用于后进先出的数据处理。

3)System.Collections 类

System.Collections 命名空间中的类是 .NET Framework 中早期的集合实现,它们不是泛型的,并且性能相对较低。然而,由于历史原因和向后兼容性,它们仍然在代码中使用。
一些常见的System.Collections 类:ArrayList、Hashtable、Queue 和 Stack

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容