C# SortedList 用法

news2024/11/23 8:29:51

文章目录

      • 基本用法
      • 主要属性和方法
      • 注意事项
    • `SortedList` 的一些高级用法和注意事项。
      • 自定义排序规则
      • 线程安全性
      • 性能考量
      • 与其他集合的对比

SortedList 是 C# 中的一个集合类,它是一个键/值对集合,其中的键自动按顺序排序。这个类位于 System.Collections.Generic 命名空间中(对于非泛型版本则是 System.Collections),并且在内部使用一种类似二叉树的结构来高效地维护排序状态。

基本用法

首先,你需要创建一个 SortedList 实例。这里是一个基本的使用示例:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 创建一个空的 SortedList,键为 int 类型,值为 string 类型
        SortedList<int, string> sortedList = new SortedList<int, string>();

        // 添加元素
        sortedList.Add(3, "Three");
        sortedList.Add(1, "One");
        sortedList.Add(2, "Two");

        // 尝试添加重复键,这将会替换原有的值
        sortedList[1] = "First"; // 这里会把键为1的值改为"First"

        // 遍历 SortedList
        foreach (var pair in sortedList)
        {
            Console.WriteLine($"Key: {pair.Key}, Value: {pair.Value}");
        }

        // 访问特定键的值
        string value = sortedList[1];
        Console.WriteLine($"Value for key 1: {value}");

        // 检查键是否存在
        bool containsKey = sortedList.ContainsKey(4);
        Console.WriteLine($"Contains key 4? {containsKey}");

        // 获取键集合或值集合
        var keys = sortedList.Keys;
        var values = sortedList.Values;
        Console.WriteLine("Keys:");
        foreach (var key in keys)
        {
            Console.Write($"{key} ");
        }
        Console.WriteLine("\nValues:");
        foreach (var val in values)
        {
            Console.Write($"{val} ");
        }
    }
}

主要属性和方法

  • Add(key, value): 向集合中添加一个新的键/值对。如果键已经存在,则会抛出异常。
  • this[key]: 索引器,可以用来获取或设置与指定键关联的值。如果键不存在且尝试设置值,会自动添加新的键/值对。
  • ContainsKey(key): 检查集合是否包含指定的键。
  • Count: 获取集合中的键/值对数量。
  • Keys: 获取包含集合中所有键的 ICollection 视图。
  • Values: 获取包含集合中所有值的 ICollection 视图。
  • Remove(key): 从集合中移除具有指定键的元素。
  • Clear(): 移除集合中的所有元素。

注意事项

  • SortedList 要求其键实现 IComparable 接口,以便确定排序顺序。如果键类型不实现此接口,你可能需要提供一个比较器 IComparer
  • 对于大量数据的排序操作,应考虑性能影响。虽然 SortedList 提供了快速的查找性能(O(log n) 查找时间复杂度),但频繁的插入和删除可能会较慢,因为它需要调整内部结构以保持排序。

泛型版本的 SortedList<TKey, TValue> 提供了类型安全,并且允许你在创建集合时指定键和值的具体类型。

SortedList 的一些高级用法和注意事项。

自定义排序规则

默认情况下,SortedList 根据键的自然排序顺序进行排序。但是,如果你想要自定义排序逻辑,可以通过提供一个实现了 IComparer<T> 接口的比较器类来实现。

下面是一个如何使用自定义比较器的例子:

using System;
using System.Collections.Generic;

// 自定义比较器类
public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // 这里我们按字符串长度进行排序
        return x.Length.CompareTo(y.Length);
    }
}

class Program
{
    static void Main()
    {
        // 使用自定义比较器创建 SortedList
        SortedList<string, string> sortedList = new SortedList<string, string>(new CustomComparer());

        sortedList.Add("Apple", " Fruit");
        sortedList.Add("Banana", "Fruit");
        sortedList.Add("Cherry", "Fruit");

        foreach (var pair in sortedList)
        {
            Console.WriteLine($"Key: {pair.Key}, Value: {pair.Value}");
        }
    }
}

在这个例子中,SortedList 会根据字符串的长度而不是字母顺序进行排序。

线程安全性

SortedList 类本身并不是线程安全的。这意味着在多线程环境下,如果不采取额外措施,直接对其进行读写操作可能会引发并发问题。如果需要在多线程环境中使用 SortedList,建议使用锁(如 lock 语句)或其他同步机制来确保线程安全。

性能考量

  • 插入和删除:尽管查找操作是高效的(O(log n)),但插入和删除操作可能需要 O(n) 时间,因为它们可能涉及到内部结构的重新平衡。
  • 内存占用:由于 SortedList 需要维护元素的排序,它通常比非排序集合(如 Dictionary)占用更多的内存。
  • 遍历:遍历 SortedList 时,元素将按照键的排序顺序返回,这对于需要有序输出的场景非常有用。

与其他集合的对比

  • 相较于 Dictionary<TKey, TValue>SortedList 提供了按键排序的功能,但牺牲了一定的插入和删除性能。
  • 如果不需要键的排序功能,且关心性能,特别是在插入和删除操作较多的情况下,Dictionary<TKey, TValue> 可能是更好的选择。
  • 如果只需要键的排序而不需要快速的插入和删除,还可以考虑使用 SortedDictionary<TKey, TValue>,它在许多情况下提供了更好的性能特性。

总之,SortedList 是一个强大且灵活的集合类,特别适合那些需要高效查找且维持元素排序的场景。理解其特性和限制,能够帮助你更有效地在项目中使用它。

一个实际的应用案例是假设你正在开发一个简单的联系人管理应用程序,需要存储并显示按照姓名排序的联系人列表。SortedList 可以完美地应用于此场景,因为它可以自动保持联系人的姓名排序,使得查询和展示变得高效且直观。

以下是一个简化的联系人管理应用示例:

using System;
using System.Collections.Generic;

class Contact
{
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public override string ToString()
    {
        return $"Name: {Name}, Phone: {PhoneNumber}";
    }
}

class ContactManager
{
    private SortedList<string, Contact> contactsByName;

    public ContactManager()
    {
        contactsByName = new SortedList<string, Contact>();
    }

    public void AddContact(Contact contact)
    {
        contactsByName.Add(contact.Name, contact);
    }

    public void RemoveContact(string name)
    {
        contactsByName.Remove(name);
    }

    public Contact GetContact(string name)
    {
        contactsByName.TryGetValue(name, out Contact contact);
        return contact;
    }

    public void DisplayContacts()
    {
        foreach (var contact in contactsByName.Values)
        {
            Console.WriteLine(contact);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        ContactManager manager = new ContactManager();
        
        manager.AddContact(new Contact { Name = "Alice", PhoneNumber = "123-456-7890" });
        manager.AddContact(new Contact { Name = "Bob", PhoneNumber = "234-567-8901" });
        manager.AddContact(new Contact { Name = "Charlie", PhoneNumber = "345-678-9012" });

        Console.WriteLine("Contacts:");
        manager.DisplayContacts();

        // 删除一个联系人
        manager.RemoveContact("Bob");

        Console.WriteLine("\nContacts after removing Bob:");
        manager.DisplayContacts();

        // 查询一个联系人
        Contact charlie = manager.GetContact("Charlie");
        if (charlie != null)
        {
            Console.WriteLine($"\nFound Charlie: {charlie}");
        }
    }
}

在这个例子中,我们创建了一个 Contact 类来表示联系人信息,并使用 SortedList<string, Contact> 来存储联系人,其中键是联系人的姓名,值是联系人对象。这样,当我们添加、删除或查询联系人时,SortedList 都能自动保证按照姓名的字母顺序排列。通过 DisplayContacts 方法,我们可以直接遍历并打印出按顺序排列的所有联系人信息。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1673362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Windows环境下安装CPU版的PyTorch

PytTorch是基于Python开发的&#xff0c;首先需要安装Python&#xff0c;Python的安装很简单&#xff0c;这里不再赘述。而 Windows用户能直接通过conda、pip和源码编译三种方式来安装PyTorch。 打开PyTorch官网&#xff08;PyTorch&#xff09;&#xff0c;在主页中根据自己的…

2024年NOC大赛创客智慧(西瓜创客)Python复赛编程真题模拟试卷包含答案

NOC复赛python模拟题 1.编写一个程序&#xff0c;提示用户输人一个矩形的长度和宽度&#xff0c;并输出其面积, 2.试计算在区间 1 到 n的所有整数中,数字x(0≤x≤9)共出现了多少次?例如在 1到11 中&#xff0c;即在 1,2,3.45,6.7,8.9,10,11 中&#xff0c;数字 1出现了 4 次.…

买货查窜货过程中的可能情况

控价除了要管控渠道中的低价、乱价链接外&#xff0c;还可能需要解决窜货问题&#xff0c;当窜货问题蔓延不及时解决时&#xff0c;渠道会越来越受影响&#xff0c;所以治理窜货也是控价过程中很重要的一步&#xff0c;窜货问题的治理多通过买货溯源来解决&#xff0c;买货要先…

关于LED的小事

基础知识 LED&#xff08;Light Emitting Diode&#xff09;是一种能够将电能转换为光能的发光二极管。LED的发明者是美国的物理学家罗伯特诺伊斯和化学家哈里贾斯特。LED的原理是利用半导体材料中的电子和空穴在禁带中产生复合&#xff0c;从而释放出光子&#xff0c;达到发光…

QLExpress入门及实战总结

文章目录 1.背景2.简介3.QLExpress实战3.1 基础例子3.2 低代码实战3.2.1 需求描述3.2.1 使用规则引擎3.3.2 运行结果 参考文档 1.背景 最近研究低代码实现后端业务逻辑相关功能&#xff0c;使用LiteFlow作为流程编排后端service服务, 但是LiteFlow官方未提供图形界面编排流程。…

深入 Go 语言:使用 math/rand 包实现高效随机数生成

深入 Go 语言&#xff1a;使用 math/rand 包实现高效随机数生成 介绍math/rand 包的核心功能设计哲学应用场景 基础使用方法初始化和种子设置设置种子创建私有随机数生成器 基础函数详解生成整数生成特定范围的整数生成浮点数随机置乱数组 进阶技巧随机数的统计属性生成正态分布…

背背佳卷土重来90天爆卖一个亿,这次盯上了成年人……

提起背背佳这三个字&#xff0c;除了00后不熟悉外&#xff0c;在座的柴油们应该没有陌生的吧&#xff01;不管你是90后&#xff0c;80后&#xff0c;还是70后&#xff0c;60后。 但是&#xff0c;似乎好多年&#xff0c;这三个字没出现过了。 但是这两天&#xff0c;背背佳这三…

嵌入式STM32中I2C控制器外设详解

STM32中的I2C外设主要负责IIC协议与外界进行通信,就像USART外设一样,我们在学习的过程中,需要抓住I2C应用的重点。 STM32在使用I2C协议时,可以通过两种方式, 一是软件模拟协议 意思是使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。例如,像点亮LED那样…

高并发系统设计-系统的“三高“目标

目录 一、高并发 1.高并发相关指标 2.如何提高并发能力 二、高并发的目标 1.高性能 2.高可用 3.高扩展 一、高并发 高并发&#xff08;High Concurrency&#xff09;是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计保证系统能…

实战6:线性回归电影票房预测-完整代码数据论文-可直接运行

直接看论文: 数据: 数据分析特征分析: 预测结果: 完整代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split

Docker 基础认识

文章目录 概念铺垫&#xff08;1&#xff09;概念铺垫&#xff08;2&#xff09;概念铺垫 &#xff08;3&#xff09;概念铺垫&#xff08;4&#xff09;Docker 定义Docker 特点Docker 架构 概念铺垫&#xff08;1&#xff09; 虚拟化相关概念 物理机&#xff1a;实际的服务器…

【人工智能Ⅱ】实验7:目标检测算法2

实验7&#xff1a;目标检测算法2 一&#xff1a;实验目的与要求 1&#xff1a;了解一阶段目标检测模型-YOLOv3模型的原理和结构. 2&#xff1a;学习通过YOLOv3模型解决目标检测问题。 二&#xff1a;实验资源 pytorch代码各文件夹内容介绍 1. data_loader.py&#xff1a;能…

【Kali Linux工具篇】wpscan的基本介绍与使用

介绍 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安全漏洞&#xff0c;其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞&#x…

LeetCode 力扣题目:买卖股票的最佳时机 III

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

template——模板进阶(C++)

在之前的文章中&#xff0c;介绍了模板初阶&#xff1a;Cpp_桀桀桀桀桀桀的博客-CSDN博客 在本篇中将会对模板进一步的讲解。本篇中的主要内容为&#xff1a;非类型模板参数、函数模板的特化、类模板的特化&#xff08;其中包含全特化和偏特化&#xff09;&#xff0c;最后讲解…

什么是数据中心?关于数据中心的这些知识一定要知道

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。数据中心&#xff0c;作为支撑海量数据存储、处理和分发的基础设施&#xff0c;其战略地位日益凸显。它们不仅是信息技术的心脏&#xff0c;更是推动现代商业决策、创新和运营的核心引擎。随着云计算、大数据、物联网…

React 第三十章 React 和 Vue 描述页面的区别

面试题&#xff1a;React 和 Vue 是如何描述 UI 界面的&#xff1f;有一些什么样的区别&#xff1f; 标准且浅显的回答&#xff1a; React 中使用的是 JSX&#xff0c;Vue 中使用的是模板来描述界面 前端领域经过长期的发展&#xff0c;目前有两种主流的描述 UI 的方案&#xf…

英语学习笔记12——名词所有格的运用

Whose is this … ? This is my/your/his/her … 这……是谁的&#xff1f;这是我的 / 你的 / 他的 / 她的…… Whose is that … ? That is my/your/his/her … 那……是谁的&#xff1f;那是我的 / 你的 / 他的 / 她的…… 词汇 Vocabulary father n. 爸爸 口语&#xf…

ICode国际青少年编程竞赛- Python-6级训练场-多次递归

ICode国际青少年编程竞赛- Python-6级训练场-多次递归 1、 def recur(n):# 边界条件if n<1:return# 额外动作Dev.turnLeft()Dev.step(n)Dev.turnRight()Dev.step(n)Dev.step(-n)Dev.turnRight()Dev.step(2*n)Dev.turnLeft()Dev.step(n)# 递归调用recur(n-1) recur(4)2、 d…

详解xlswriter 操作Excel的高级应用conditional_format

在文章详解xlsxwriter 操作Excel的常用API-CSDN博客 我们介绍了xlswriter 基础api的使用情况&#xff0c;在实际工作中我们经常会遇到下面的需求&#xff0c;cell满足某某条件时&#xff0c;进行对应的格式化处理。这时候我们可以使用conditional_format的函数&#xff0c;他允…