C# Dictionary初始化的详解

一、基础认识

C#中的Dictionary是一种键值对存储的数据类型,可以根据键(Key)访问对应的值(Value),它是.NET Framework中的常用类之一。创建Dictionary的方式包括使用默认构造函数,使用带有容量参数的构造函数,以及从其他Dictionary或键值对数组中填充Dictionary。

下面是使用默认构造函数创建Dictionary的示例代码:

Dictionary dict = new Dictionary();

以上代码创建了一个空的Dictionary,可以使用Add方法添加新的键值对,也可以通过索引器访问Dictionary中的特定键值对。使用Add方法添加新键值对:

dict.Add("Apple", 1);
dict.Add("Banana", 2);
dict.Add("Orange", 3);

使用索引器访问Dictionary中的键值对:

int count = dict["Apple"];

如果键值对不存在,则会抛出KeyNotFoundException异常。还可以使用TryGetValue方法避免这种情况:

int count;
if(!dict.TryGetValue("onion", out count))
{
    Console.WriteLine("No such key exists in the dictionary.");
}

二、容量和性能优化

使用带有容量参数的构造函数,可以在创建Dictionary时指定预计容量,这会为存储数据提供更好的性能和增加容量的灵活性。当Dictionary的元素数量超过容量时,系统会自动重新分配更大的内存空间,这可能会导致性能下降。因此,预计Dictionary中存储的元素数量并指定初始容量是一种容量和性能优化的方式。

以下是使用带有容量参数的构造函数创建Dictionary的示例代码:

Dictionary dict = new Dictionary(100);

三、从其他数据类型填充Dictionary

从其他Dictionary、数组或列表中填充Dictionary是常用的操作,下面是从另一个Dictionary中填充Dictionary的示例代码:

Dictionary sourceDict = new Dictionary
{
    { "Apple", 1 },
    { "Banana", 2 },
    { "Orange", 3 }
};

Dictionary targetDict = new Dictionary(sourceDict);

以上代码从sourceDict中复制键值对到targetDict,targetDict现在包含与sourceDict相同的键值对。也可以使用ToDictionary方法从数组或列表中创建Dictionary,下面是从数组中创建Dictionary的示例代码:

string[] fruits = { "Apple", "Banana", "Orange" };
int[] counts = { 1, 2, 3 };

Dictionary dict = fruits
    .Select((fruit, index) => new { fruit, count = counts[index] })
    .ToDictionary(item => item.fruit, item => item.count);

以上代码使用Select方法将fruits和counts数组组合成一个元素类型为{string, int}的数组,然后使用ToDictionary方法将该数组转换为Dictionary。这种方式可以从任何数组或列表中创建Dictionary。

四、使用枚举器来访问Dictionary中的元素

遍历Dictionary中的键值对通常需要使用枚举器。这里介绍两种使用枚举器的方式:使用foreach语句和使用LINQ查询。

使用foreach语句遍历Dictionary中的键值对:

Dictionary dict = new Dictionary
{
    { "Apple", 1 },
    { "Banana", 2 },
    { "Orange", 3 }
};

foreach(KeyValuePair pair in dict)
{
    Console.WriteLine("{0} = {1}", pair.Key, pair.Value);
}

以上代码使用foreach语句遍历Dictionary中的键值对,并输出键和值。KeyValuePair是一个由键和值组成的结构体,它包含Key和Value属性。

使用LINQ查询遍历Dictionary中的键值对:

Dictionary dict = new Dictionary
{
    { "Apple", 1 },
    { "Banana", 2 },
    { "Orange", 3 }
};

var pairs = dict.Select(pair => string.Format("{0} = {1}", pair.Key, pair.Value));
Console.WriteLine(string.Join(", ", pairs));

以上代码使用LINQ查询遍历Dictionary中的键值对,并将键值对输出为字符串。

五、使用EqualityComparer自定义Dictionary的键类型

默认情况下,Dictionary中的键类型为Object,如果键类型不是基元类型或字符串等.NET Framework提供的一些常用类型,则需要自定义EqualityComparer。EqualityComparer是一个用于比较两个对象是否相等的类型,需要实现GetHashCode和Equals方法,以下是实现自定义EqualityComparer的示例代码:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class PersonEqualityComparer : IEqualityComparer
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name && x.Age == y.Age;
    }

    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode() ^ obj.Age;
    }
}

Dictionary dict = new Dictionary(new PersonEqualityComparer())
{
    { new Person { Name = "Alice", Age = 20 }, 1 },
    { new Person { Name = "Bob", Age = 25 }, 2 }
};

int count = dict[new Person { Name = "Alice", Age = 20 }];

以上代码使用自定义EqualityComparer,将Person类型用作Dictionary的键类型,并添加了两个Person键值对。注意,Person类需要实现GetHashCode和Equals方法才能与自定义EqualityComparer一起使用。

六、总结

本文从基础使用、容量和性能优化、从其他数据类型填充、使用枚举器访问、自定义EqualityComparer等多个方面对C#中的Dictionary初始化进行了详细的介绍和讲解,希望读者对于该数据类型有更加深入的了解和掌握。

原创文章,作者:VAKRO,如若转载,请注明出处:https://www.506064.com/n/371714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VAKROVAKRO
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相关推荐

  • Go中struct的初始化

    本文将从多个方面详细阐述Go中struct的初始化方式,包括使用字面量初始化、使用new函数初始化以及使用构造函数等。通过本文的介绍,读者能够更深入的了解Go中struct的初始化…

    编程 2025-04-28
  • 用Python的Dictionary写井字棋游戏

    本文将详细介绍如何使用Python的Dictionary来编写一个井字棋游戏,并提供完整的代码示例。 一、构造棋盘 我们可以使用一个3×3的Dictionary来表示井字…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25

发表回复

登录后才能评论