适合每位开发人员的 60 个 C# 代码片段( 三 )


用例:
避免计算算法中的重复计算
缓存来自数据库或 API 的常用数据
6.UsingDictionary<TKey, TValue>.ValueCollectionDictionary<string, int> fruits = new Dictionary<string, int> { { "Apple", 1 }, { "Banana", 2 } };Dictionary<string, int>.ValueCollection fruitValues = fruits.Values;许多人忘记了可以使用 Values 属性将字典值作为集合直接访问 。当您只需要使用字典中的值而不是键时,这会很方便 。
用例:
总结字典中的所有值
查找字典中的最小值或最大值
7. 使用 AsParallel 进行并行操作
Dictionary<string, int> largeDictionary = ... // Large dictionaryvar modifiedDictionary = largeDictionary.AsParallel().Select(kvp => new { kvp.Key, Value = https://www.isolves.com/it/cxkf/yy/C/2023-09-01/kvp.Value * 2 }).ToDictionary(x => x.Key, x => x.Value);LINQ 中的 AsParallel 方法提供了一种并行执行操作的方法,这可以在处理大型字典时显着提高性能 。请注意,您应该谨慎使用它,因为它可能不会为较小的字典带来好处,甚至可能由于并行性的开销而降低性能 。
用例:
对大型字典执行耗时的操作
对字典中的每个值应用函数进行数据转换
8.UsingDictionary<TKey, TValue>.KeyCollection
Dictionary<string, int> fruits = new Dictionary<string, int> { { "Apple", 1 }, { "Banana", 2 } };Dictionary<string, int>.KeyCollection fruitKeys = fruits.Keys;与我们之前讨论的 ValueCollection 类似,KeyCollection 使您可以直接访问字典中的键 。这是迭代键而不用担心值的好方法 。
用例:
检查字典中是否存在某个键
迭代所有键以进行数据分析
9. 使用HashSet<T>删除重复项
Dictionary<string, int> fruitsWithDuplicates = new Dictionary<string, int> { { "Apple", 1 }, { "Apple", 1 }, { "Banana", 2 } };Dictionary<string, int> fruitsWithoutDuplicates = new HashSet<string>(fruitsWithDuplicates.Keys).ToDictionary(x => x, x => fruitsWithDuplicates[x]);HashSet<T> 是一个经常被忽视但功能强大的工具,用于从集合中删除重复项 。当与字典结合使用时,它可以用于删除重复的键并创建新的字典 。
用例:
从用户输入字典中删除重复项
预处理期间清理数据
10.使用SortedDictionary<TKey, TValue>进行自动排序SortedDictionary<string, int> sortedFruits = new SortedDictionary<string, int> { { "Apple", 1 }, { "Banana", 2 } };SortedDictionary<TKey, TValue> 自动对字典中的键进行排序 。当您不断需要数据处于排序状态时,它会很有用 。但请注意,排序过程可能会带来性能成本 。
用例:
实现优先级队列
维护二分搜索操作的排序数据
10 个线程片段1.任务.运行快捷方式Task.Run(() => {// Long running operation...});Task.Run 是启动后台任务的便捷快捷方式 。这相当于创建一个新任务然后调用 Start(),但代码更少 。谁不喜欢简洁?
用例:
开始一项不需要立即关注的新操作
在不阻塞主线程的情况下进行繁重的计算
2. 取消令牌CancellationTokenSource cts = new CancellationTokenSource();Task.Run(() => {// Check the cancellation token regularlywhile (!cts.Token.IsCancellationRequested){// Do some work...}}, cts.Token);// Cancel the taskcts.Cancel();取消令牌可让您优雅地停止正在执行的任务 。这就像友好地拍一下你的肩膀,告诉你的任务是时候停止了 。
用例:
退出应用程序时停止后台操作
当不再需要时取消长时间运行的操作
3. 使用Interlocked.Increment进行安全更新int counter = 0;Parallel.For(0, 10000, i => Interlocked.Increment(ref counter));Interlocked 类为多个线程共享的变量提供原子操作 。Interlocked.Increment 是一种在多线程环境中安全递增计数器的方法 。它确保您的计数不会错过任何一个节拍 。
用例:
多线程场景下更新共享计数器
确保基于线程的竞争条件不会导致错误的结果
4.与Mutex同步Mutex mutex = new Mutex();mutex.WAItOne();try {// Do some work...}finally {mutex.ReleaseMutex();}互斥体就像线程的红绿灯 。它们确保一次只有一个线程可以访问一段代码,从而防止出现令人不快的意外情况 。
用例:
保护代码的关键部分免遭同时访问
跨多个线程同步操作
5. 使用BlockingCollection<T>进行线程安全数据处理BlockingCollection<int> data = https://www.isolves.com/it/cxkf/yy/C/2023-09-01/new BlockingCollection


推荐阅读