C# Dictionary(字典)的用法

C# Dictionary(字典)的用法

C# Dictionary(字典)的用法

在C#中,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老吕说:如果您觉得本文有帮助,辛苦您🙏帮忙点赞、收藏、评论,您的举手之劳将对我提供了无限的写作动力!🤞

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》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python老吕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值