![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
集合、枚举器和迭代器
Sbjhy
这个作者很懒,什么都没留下…
展开
-
C# 经典实例 第二章 集合、枚举器和迭代器 #2.10 使用线程安全的字典进行并发访问,不手动加锁
问题:你需要创建一个从多个线程中并发读写的键值对的集合,并且不需要手动使用同步原语来保护它。解决方案:使用ConcurrentDictionary<Tkey,TValue>容纳数据项并线程安全的方式来访问它们。举例来说,考虑一个模拟情形,球迷到一个体育馆去观看他们喜爱的体育赛事,并且场馆仅有若干个入口。首先,我们需要一些球迷并且记录他们的名称、何时入场以及通过哪个入口入场。 public class Fan { public s原创 2020-09-23 10:52:40 · 256 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.9 在类中实现嵌套的foreach功能
问题:你需要一个类,它包含一个对象列表,其中每个对象也包含一个对象列表。你希望以如下方式使用嵌套的foreach循环遍历外层和内层列表中的所有对象。foreach (Group<Item> subGroup in topLevelGroup){ // 操作组 foreach (Item item in subGroup) { // 操作数据项 }}解决方案:在类上实现IEnumerable<原创 2020-09-23 10:16:42 · 282 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.8 处理finally语句块和迭代器
问题:你向迭代器中添加了一个try-finally语句块,并且注意到finally块并没有按所想的那样执行。解决方案:在GetEnumerator迭代器中用一个try块包围迭代代码,并在该try块后接一个finally块,代码如下所示: public static void TestFinallyAndIterators() { //Create a StringSet object and fill it with data原创 2020-09-22 16:48:19 · 223 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.7 创建自定义枚举器
问题:你需要向一个类中添加foreach支持,但是通常永固添加迭代器的方式(即在类型上实现IEnumerable并从一个成员函数返回执行这个IEnumerable的引用)并不足够灵活。除了简单的从第一个元素迭代到最后一个元素之外,还需要从最后一个元素迭代到第一个元素,并且需要能够在每次迭代时跨越或跳过预定义数量的元素。你想使所有这些类型的迭代器可供你的类使用。解决方案:例2-4中所示的Container<T>类充当一个名为internalList的私有List<T>的容器原创 2020-09-22 11:56:21 · 235 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.6 测试Array或List<T>中的每个元素
问题:你需要采用一种容易的方法来测试Array或List<T>中的每个元素。这种测试的结果应该指示集合中的所有元素都通过了测试,或者集合中至少有一个元素没有通过测试。解决方案:使用TrueForAll方法,代码如下所示: public static void TestArrayForNulls() { // Create a List of strings List<string> strings =原创 2020-09-22 11:21:30 · 165 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.5 在应用程序会话间持久化一个集合
问题:你有一个诸如ArrayList、List<T>、Hashtable或者Dictionary<T,U>这样的集合,在其中存储应用程序信息。可以使用该信息将应用程序的环境定制成最后一只的设置(例如,窗口大小,窗口位置和当前显示的工具栏)。也可以用它来允许用户在上一次关闭应用程序的相同位置启动应用程序。换句话说,如果用户正在编辑发票并且需要在晚上关闭计算机,当下次启动应用程序时,它将准确的知道初始化要显示哪张发票。解决方案:在对象与文件之间进行序列化/反序列化。原创 2020-09-22 11:07:45 · 125 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.4 创建具有最小值和最大值边界的Dictionary
问题:你需要在项目中使用一个泛型Dictionary对象,它在值中仅存储预定义最大值和最小值之间的数值数据(键可以是任意类型)。解决方案:创建一个类,它带有强制执行这些边界的访问器和方法。例2-2中所示的类MinMaxValueDictionary只允许存储实现了IComparable接口的类型,并且其值位于最大值和最小值之间。例2-2:创建具有最小值和最大值边界的字典: [Serializable] public class MinMaxValueDi原创 2020-09-22 10:49:32 · 251 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.3 对Dictionary的键和/或值排序
问题:你想要对一个Dictionary中包含的键和/或值排序,以便把整个Dictionary显示给用户,并以升序或降序方式对它进行排序。解决方案:通过LINQ查询以及Dictionary<T,U>对象的Keys和Values属性,获得其键和值对象的有序ICollection.下面所示的代码显示以升序或降序排序的Dictionary<T,U>的键和值。 public static void TestSortKeyValues() {原创 2020-09-22 10:39:43 · 184 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.2 保持List<T>有序
问题:你将使用List<T>的BinarySearch方法定期查找List<T>中的特定元素。在查找过程中,将穿插进行添加、修改和删除的操作。不过,BinarySearch方法预先假设数组是有序的。如果List<T>是无序的,BinarySearch方法可能返回不正确的结果。你不希望必须记住在调用List<T>.BinarySearch方法之前调用List<T>.Sort方法。更不必说会引入与该调用关联的所有开销。你需要采用一种方法保持List原创 2020-09-22 10:27:14 · 167 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 #2.1 寻找List<T>中的重复数据项
问题:你需要能够对一个List<T>中匹配搜索条件的对象进行读取或计数操作。解决方案:使用List<T>的四个扩展方法:GetAll,BinarySearchGetAll、CountAll和BinarySearchCountAll。这些方法扩展List<T>类,以返回特定的对象实例或特定对象出现在有序和无序List<T>中的次数,如例2-1所示。例2-1:确定一个数据项在List<T>中出现的次数 static class原创 2020-09-22 10:02:10 · 299 阅读 · 0 评论 -
C# 经典实例 第二章 集合、枚举器和迭代器 简介
简介集合是一组数据项;在.NET中,集合包含对象,而包含在集合中的每个对象被称为元素(element)。有些集合包含简单的元素列表,而另外一些集合[比如字典(dictionary)]则包含键值对的列表。下列集合类型包含简单的元素列表: System.Collections.ArrayList System.Collections.BitArray System.Collections.Queue System.Collections.Stack System原创 2020-09-22 09:31:21 · 173 阅读 · 0 评论