C# Dictionary(字典)的用法

Python老吕 2024-10-23 16:35:01 阅读 72

C# Dictionary(字典)的用法

C# Dictionary(字典)的用法1. 创建Dictionary2. 添加键值对3. 访问元素4. 修改元素5. 删除元素6. 遍历Dictionary7. 检查键是否存在8. 容量和扩容9. 线程安全总结

C# Dictionary(字典)的用法

C# Dictionary(字典)的用法

在C#中,<code>Dictionary<TKey, TValue> 是一个泛型集合,它表示一个键值对的集合。与数组或列表不同,Dictionary 使用键(Key)来访问存储在集合中的项,这些键必须是唯一的。Dictionary 通常用于快速查找、添加、删除键值对。

以下是Dictionary在C#中的一些基本用法:

1. 创建Dictionary

首先,你需要指定键和值的类型来创建一个Dictionary

Dictionary<string, int> dictionary = new Dictionary<string, int>();

在这个例子中,我们创建了一个键为string类型,值为int类型的Dictionary

2. 添加键值对

使用Add方法或集合初始化器来添加键值对。

// 使用 Add 方法

dictionary.Add("apple", 1);

dictionary.Add("banana", 2);

// 使用集合初始化器

Dictionary<string, int> anotherDictionary = new Dictionary<string, int>

{ -- -->

{ "cherry", 3 },

{ "date", 4 }

};

3. 访问元素

通过键来访问Dictionary中的元素。

if (dictionary.ContainsKey("apple"))

{

int appleCount = dictionary["apple"];

Console.WriteLine($"We have { appleCount} apples.");

}

4. 修改元素

你可以通过键来修改Dictionary中的值。

dictionary["apple"] = 5; // 现在 apple 的数量为 5

5. 删除元素

使用Remove方法来删除键值对。

dictionary.Remove("banana"); // 删除键为 "banana" 的项

6. 遍历Dictionary

你可以使用foreach循环来遍历Dictionary中的键值对。

foreach (var pair in dictionary)

{

Console.WriteLine($"Key = { pair.Key}, Value = { pair.Value}");

}

或者,如果你只对键或值感兴趣,你可以这样做:

// 遍历键

foreach (string key in dictionary.Keys)

{

Console.WriteLine(key);

}

// 遍历值

foreach (int value in dictionary.Values)

{

Console.WriteLine(value);

}

7. 检查键是否存在

使用ContainsKey方法来检查Dictionary中是否包含特定的键。

if (dictionary.ContainsKey("orange"))

{

// 键存在,处理它...

}

else

{

// 键不存在,执行其他操作...

}

8. 容量和扩容

虽然Dictionary会自动管理其容量,但你也可以在创建时指定初始容量和负载因子。这可能会影响性能,尤其是在你知道将添加大量项时。

// 创建一个初始容量为 100 的 Dictionary

Dictionary<string, int> capacityDictionary = new Dictionary<string, int>(100);

// 负载因子(默认为 0.75)决定了何时扩容

// 这不是常用的设置,除非你有特定的性能需求

9. 线程安全

Dictionary<TKey, TValue> 类本身不是线程安全的。这意味着,如果你在多线程环境中不加锁或其他同步机制就操作同一个 Dictionary 实例,可能会导致数据不一致或其他不可预测的行为。

为了在多线程环境中安全地使用 Dictionary,你可以采取以下几种方法:

使用锁(lock):

通过在访问 Dictionary 时使用 lock 语句,你可以确保一次只有一个线程可以修改它。

lock (someLockObject)

{

// 安全地访问或修改 Dictionary

if (dictionary.ContainsKey("apple"))

{

// ...

}

}

使用 ConcurrentDictionary<TKey, TValue>:

ConcurrentDictionary<TKey, TValue> 是专门为多线程环境设计的,它提供了线程安全的键值对集合。它提供了与 Dictionary 类似的功能,但自动处理同步。

ConcurrentDictionary<string, int> concurrentDictionary = new ConcurrentDictionary<string, int>();

// 可以安全地在多个线程中添加、获取或删除项,无需额外同步

使用 MonitorMutex 或其他同步原语:

除了 lock 语句外,你还可以使用 Monitor 类、互斥锁(Mutex)或其他同步机制来保护对 Dictionary 的访问。

避免在迭代时修改:

如果你正在遍历 Dictionary 并在迭代过程中修改它(例如,添加或删除项),可能会导致异常。即使你使用锁来同步访问,也最好避免这种情况。如果需要修改,考虑收集要添加的项或要删除的键的列表,然后在迭代完成后进行批量操作。

读取操作通常是线程安全的(但不建议依赖于此):

虽然读取操作本身可能不会破坏 Dictionary 的内部结构,但在没有同步的情况下读取可能会看到不一致的数据状态(例如,一个线程正在添加项,而另一个线程正在读取)。因此,即使读取操作在技术上可能是“线程安全的”,也不建议在没有同步的情况下依赖它们。

总结

Dictionary<TKey, TValue> 是一个强大且灵活的集合类型,它允许你使用键来存储和检索值。然而,在多线程环境中使用时需要特别小心,以确保线程安全性。通过使用锁、ConcurrentDictionary 或其他同步机制,你可以安全地在多个线程之间共享和修改 Dictionary

C# Dictionary(字典)的用法

👨‍💻博主Python老吕说:如果您觉得本文有帮助,辛苦您🙏帮忙点赞、收藏、评论,您的举手之劳将对我提供了无限的写作动力!🤞

<code>print('Hello,PythonLaoLv!') # 每日一码,用Python跟大家问好!


🔥精品付费专栏:《跟老吕学Python》


🌞精品免费专栏:《Python全栈工程师·附录资料》、《Pillow库·附录资料》、《Pygame·附录资料》、《Tkinter·附录资料》、《Django·附录资料》、《NumPy·附录资料》、《Pandas·附录资料》、《Matplotlib·附录资料》


🌐前端免费专栏:《HTML》、《CSS》、《JavaScript》、《Vue》


💻后端免费专栏:《C语言》、《C++语言》、《Java语言》、《R语言》、《Ruby语言》、《PHP语言》、《Go语言》、《C#语言》、《Swift语言》


💾数据库免费专栏:《Oracle》、《MYSQL》、《SQL》、《PostgreSQL》、《MongoDB》




声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。