翼度科技»论坛 编程开发 .net 查看内容

第五单元 泛型集合

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
1. 为什么选择使用泛型集合

存在的问题
  1. ArrayList arrylist = new ArrayList() { 14, "hello", 29.7, true};
  2. arrylist.Add("world");// object
  3. double dsum = 0;
  4. foreach(var item in arrylist)
  5. {
  6.     dsum += Convert.ToDouble(item); // 出现异常
  7. }
复制代码
 
1、存取数据需要进行装箱拆箱 2、数据类型转换存在隐患
 
性能对比

非泛型集合性能
  1. [Test]
  2. public void Test1()
  3. {
  4.     Stopwatch watch = new Stopwatch();
  5.     watch.Start();
  6.     ArrayList arrayList = new();
  7.     for (int i = 0; i < 2000000; i++)
  8.     {
  9.         arrayList.Add(i); // 装箱
  10.     }
  11.     long sum = 0;
  12.     foreach (var item in arrayList)
  13.     {
  14.         sum += Convert.ToInt64(item);
  15.     }
  16.     watch.Stop();
  17.     Console.WriteLine("非泛型集合耗时(ms):"+watch.ElapsedMilliseconds);
  18. }
复制代码
 
输出结果:非泛型集合耗时(ms):258
 
泛型集合性能
  1. [Test]
  2. public void Test1()
  3. {
  4.     Stopwatch watch = new Stopwatch();
  5.     watch.Start();
  6.     var arrayList = new List<int>();
  7.     for (int i = 0; i < 2000000; i++)
  8.     {
  9.         arrayList.Add(i);
  10.     }
  11.     long sum = 0;
  12.     foreach (var item in arrayList)
  13.     {
  14.         sum += Convert.ToInt64(item);
  15.     }
  16.     watch.Stop();
  17.     Console.WriteLine("泛型集合耗时(ms):"+watch.ElapsedMilliseconds);
  18. }
复制代码
 
输出结果:泛型集合耗时(ms):25
 
2. List 集合

使用场景:

  • 在Linq 中比较常见
  • 存储数据
声明
  1. 声明泛型集合
复制代码
  1. List<T> 集合名=new List<T>()
复制代码
  1. <br><br>例如:
复制代码
  1. //值类型
  2. List<int> list = new List<int>();
  3. //引用类型
  4. List<PersonModel> personList = new List<PersonModel>()
复制代码
 
1、T只是占位符,会被传递的数据类型替换。 2、实例化List时传入相对应的数据类型 3、长度以2倍速度扩容
 
List 常用属性

CountList集合中当前存储的元素个数CapacityList集合当前容量 Capacity>=Count
  1. List<int> list = new List<int>() { 2, 3, 7, 5, 9 }; // 集合初始化器
  2. Count  :  5    Capacity   : 8
复制代码
 
 List 常用方法
Add()添加到List集合尾部 Add(元素) 如:strlist.Add(“me”)Insert()添加到List集合指定位置 Insert(下标,元素) 如:strlist.Insert(2,”Hi”)Remove()删除List集合中的元素 Remove(元素) 如:strlist.Remove(“c”)RemoveAt()删除List集合中指定下标的元素 RemoveAt(下标)如:strlist.RemoveAt(3)RemoveRange()删除List集合中指定范围的元素 RemoveRange(下标,个数), 如:strlist.RemoveRange(1,2)Clear()清空List集合中所有元素 Clear()First()返回List集合中第一个元素FirstOrDefault ()返回List集合中第一个元素为空是返回默认值Last()返回List集合中最后一个元素LastOrDefault ()返回List集合最后一个元素为空时返回默认值 
  1. List<int> list = new List<int>() { 2, 3, 7, 5, 9 };
  2. list.Add(10); // 2, 3, 7, 5, 9,10
  3. list.Insert(2,6); //   2, 3,6, 7, 5, 9,10
  4. list.Remove(2); // 3,6, 7, 5, 9,10
  5. list.RemoveAt(0); // 6, 7, 5, 9,10
  6. list.RemoveRange(1,2); // 6,9,10
  7. list.First();// 6
  8. list.FirstOrDefault(); // 6
  9. list.Last();// 10
  10. list.LastOrDefault(); // 10
  11. list.Clear(); // 集合为空
复制代码
 
 
3. Stack 栈

特点:先进后出,后进先出

 
  1. [Test]
  2. public void Test1()
  3. {
  4.     Stack<int> stack = new Stack<int>();
  5.     stack.Push(10); // 压栈  10
  6.     stack.Push(9);  // 9,10
  7.     stack.Push(8);  // 8,9,10
  8.     var peek = stack.Peek(); // 8 返回最顶的元素
  9.     var item = stack.Pop();// 8 , 移除并返回最顶的元素,stack 还剩下 9,10
  10.     foreach (var s in stack)
  11.     {
  12.         Console.WriteLine(s); // 输出 9 ,10
  13.     }
  14. }
复制代码
 
 4. Queue 队列
特点:先进先出

 
  1. [Test]
  2. public void Test1()
  3. {
  4.     Queue<int> queue = new Queue<int>();
  5.     queue.Enqueue(10); // 入队
  6.     queue.Enqueue(9);
  7.     queue.Enqueue(8);
  8.     queue.Enqueue(7);
  9.     Console.WriteLine(queue.Peek()); // 返回最开始的元素,10(出队方向的第一个元素)
  10.     var item = queue.Dequeue();// 删除出队方向的第一个元素 并返回它的值 ,10
  11.     foreach (var q in queue)
  12.     {
  13.         Console.WriteLine(q); // 9,8,7
  14.     }
  15. }
复制代码
 
 
5. SortedList 类

表示基于相关的 IComparer 实现按键进行排序的键/值对的集合。

  • TKey 集合中的键的类型。
  • TValue 集合中值的类型。
 
快速入门
  1. [Test]
  2. public void Test1()
  3. {
  4.     // 成绩列表
  5.     SortedList<string,int> scoreList = new SortedList<string,int>();
  6.     scoreList["b"] = 80;
  7.     scoreList["c"] = 50;
  8.     scoreList.Add("a",100);
  9.     foreach (var score in scoreList)
  10.     {
  11.         Console.WriteLine($"科目:{score.Key},成绩:{score.Value}");
  12.     }
  13. }
复制代码
 
输出结果:
  1. 科目:a,成绩:100<br>科目:b,成绩:80<br>科目:c,成绩:50
复制代码
 
详细案例
  1. using System;
  2. using System.Collections.Generic;
  3. public class Example
  4. {
  5.     public static void Main()
  6.     {
  7.         // 创建一个键值对都是string 类型的集合
  8.         SortedList<string, string> openWith =
  9.             new SortedList<string, string>();
  10.         // 初始化一些没有重复键的元素,但对应的值,有些元素是重复的
  11.         openWith.Add("txt", "notepad.exe");
  12.         openWith.Add("bmp", "paint.exe");
  13.         openWith.Add("dib", "paint.exe");
  14.         openWith.Add("rtf", "wordpad.exe");
  15.        // 如果添加一个已经存在的键值对,则会抛出异常
  16.         try
  17.         {
  18.             openWith.Add("txt", "winword.exe");
  19.         }
  20.         catch (ArgumentException)
  21.         {
  22.             Console.WriteLine("An element with Key = "txt" already exists.");
  23.         }
  24.         // 元素的键可作为集合的索引来访问元素
  25.         Console.WriteLine("For key = "rtf", value = {0}.",
  26.             openWith["rtf"]);
  27.         // 通过键索引,可修改其所关联的值
  28.         openWith["rtf"] = "winword.exe";
  29.         Console.WriteLine("For key = "rtf", value = {0}.",
  30.             openWith["rtf"]);
  31.         // 如果键不存在,则会新增一个键值对数据
  32.         openWith["doc"] = "winword.exe";
  33.         // 如果请求的键不存在,则会抛出异常
  34.         try
  35.         {
  36.             Console.WriteLine("For key = "tif", value = {0}.",
  37.                 openWith["tif"]);
  38.         }
  39.         catch (KeyNotFoundException)
  40.         {
  41.             Console.WriteLine("Key = "tif" is not found.");
  42.         }
  43.         // 当一个程序经常要尝试的键,结果却不是  在列表中,TryGetValue可以是一个更有效的  
  44.         // 获取值的方法。  
  45.         string value = "";
  46.         if (openWith.TryGetValue("tif", out value))
  47.         {
  48.             Console.WriteLine("For key = "tif", value = {0}.", value);
  49.         }
  50.         else
  51.         {
  52.             Console.WriteLine("Key = "tif" is not found.");
  53.         }
  54.         // 判断是否包含键
  55.         if (!openWith.ContainsKey("ht"))
  56.         {
  57.             openWith.Add("ht", "hypertrm.exe");
  58.             Console.WriteLine("Value added for key = "ht": {0}",
  59.                 openWith["ht"]);
  60.         }
  61.         // 遍历循环,元素被检索为KeyValuePair对象
  62.         Console.WriteLine();
  63.         foreach( KeyValuePair<string, string> kvp in openWith )
  64.         {
  65.             Console.WriteLine("Key = {0}, Value = {1}",
  66.                 kvp.Key, kvp.Value);
  67.         }
  68.         // 获取集合中的Values 列表
  69.         IList<string> ilistValues = openWith.Values;
  70.         // 打印出所有的值列表
  71.         Console.WriteLine();
  72.         foreach( string s in ilistValues )
  73.         {
  74.             Console.WriteLine("Value = {0}", s);
  75.         }
  76.         // 通过索引获取值
  77.         Console.WriteLine("\nIndexed retrieval using the Values " +
  78.             "property: Values[2] = {0}", openWith.Values[2]);
  79.         // 获取所有的Key
  80.         IList<string> ilistKeys = openWith.Keys;
  81.         // 打印出所有的键列表
  82.         Console.WriteLine();
  83.         foreach( string s in ilistKeys )
  84.         {
  85.             Console.WriteLine("Key = {0}", s);
  86.         }
  87.         // 通过索引获取Key
  88.         Console.WriteLine("\nIndexed retrieval using the Keys " +
  89.             "property: Keys[2] = {0}", openWith.Keys[2]);
  90.         // 移除元素
  91.         Console.WriteLine("\nRemove("doc")");
  92.         openWith.Remove("doc");
  93.         if (!openWith.ContainsKey("doc"))
  94.         {
  95.             Console.WriteLine("Key "doc" is not found.");
  96.         }
  97.     }
  98. }
  99. /* This code example produces the following output:
  100. An element with Key = "txt" already exists.
  101. For key = "rtf", value = wordpad.exe.
  102. For key = "rtf", value = winword.exe.
  103. Key = "tif" is not found.
  104. Key = "tif" is not found.
  105. Value added for key = "ht": hypertrm.exe
  106. Key = bmp, Value = paint.exe
  107. Key = dib, Value = paint.exe
  108. Key = doc, Value = winword.exe
  109. Key = ht, Value = hypertrm.exe
  110. Key = rtf, Value = winword.exe
  111. Key = txt, Value = notepad.exe
  112. Value = paint.exe
  113. Value = paint.exe
  114. Value = winword.exe
  115. Value = hypertrm.exe
  116. Value = winword.exe
  117. Value = notepad.exe
  118. Indexed retrieval using the Values property: Values[2] = winword.exe
  119. Key = bmp
  120. Key = dib
  121. Key = doc
  122. Key = ht
  123. Key = rtf
  124. Key = txt
  125. Indexed retrieval using the Keys property: Keys[2] = doc
  126. Remove("doc")
  127. Key "doc" is not found.
  128. */
复制代码
 
6. Dictionary 字典集合

HashTable

HashTable 哈唏表, 也叫散列表,有关详细的Hash解说,请查看文章: Hash(散列函数)_百度百科 (baidu.com)
值得强调的是:常见的Hash算法有MD5(彩虹表,Hash撞库), SHA1 均已被破解,目前推荐的Hash 算法是:SHA2-256。
彩虹表: 用来存放所有hash值的部分hash值字典。然后通过碰撞破解密码
  1. using System;
  2. using System.Collections;
  3. class Example
  4. {
  5.     public static void Main()
  6.     {
  7.         
  8.         Hashtable openWith = new Hashtable();
  9.         // 初始化一批数据,不可出现重复键
  10.         openWith.Add("txt", "notepad.exe");
  11.         openWith.Add("bmp", "paint.exe");
  12.         openWith.Add("dib", "paint.exe");
  13.         openWith.Add("rtf", "wordpad.exe");
  14.         // 如果出现重复键,则会抛出异常
  15.         try
  16.         {
  17.             openWith.Add("txt", "winword.exe");
  18.         }
  19.         catch
  20.         {
  21.             Console.WriteLine("An element with Key = "txt" already exists.");
  22.         }
  23.         // 通过索引访问
  24.         Console.WriteLine("For key = "rtf", value = {0}.", openWith["rtf"]);
  25.         // 修改索引所关联的值
  26.         openWith["rtf"] = "winword.exe";
  27.         Console.WriteLine("For key = "rtf", value = {0}.", openWith["rtf"]);
  28.         // 给一个不存在的键赋值,则会新增
  29.         openWith["doc"] = "winword.exe";
  30.         // 判断是否包含
  31.         if (!openWith.ContainsKey("ht"))
  32.         {
  33.             openWith.Add("ht", "hypertrm.exe");
  34.             Console.WriteLine("Value added for key = "ht": {0}", openWith["ht"]);
  35.         }
  36.         // 遍历循环,元素被检索为 DictionaryEntry 对象
  37.         Console.WriteLine();
  38.         foreach( DictionaryEntry de in openWith )
  39.         {
  40.             Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
  41.         }
  42.         // 获取所有的值集合
  43.         ICollection valueColl = openWith.Values;
  44.         // 遍历值集合
  45.         Console.WriteLine();
  46.         foreach( string s in valueColl )
  47.         {
  48.             Console.WriteLine("Value = {0}", s);
  49.         }
  50.         // 获取所有的键
  51.         ICollection keyColl = openWith.Keys;
  52.         // 遍历键集合
  53.         Console.WriteLine();
  54.         foreach( string s in keyColl )
  55.         {
  56.             Console.WriteLine("Key = {0}", s);
  57.         }
  58.         // 移除键值对
  59.         Console.WriteLine("\nRemove("doc")");
  60.         openWith.Remove("doc");
  61.         if (!openWith.ContainsKey("doc"))
  62.         {
  63.             Console.WriteLine("Key "doc" is not found.");
  64.         }
  65.     }
  66. }
复制代码
 
不建议将类用于 Hashtable 新开发。 相反,我们建议使用泛型 Dictionary 类。 有关详细信息,请参阅不应在GitHub上使用非泛型集合
 
Dictionary

表示键和值的集合。

  • TKey : 字典中的键的类型。
  • TValue : 字典中的值的类型。
  1. [/code][code]Dictionary<string, string> openWith =
  2.     new Dictionary<string, string>();
  3. // 初始化数据,不能存在重复键
  4. openWith.Add("txt", "notepad.exe");
  5. openWith.Add("bmp", "paint.exe");
  6. openWith.Add("dib", "paint.exe");
  7. openWith.Add("rtf", "wordpad.exe");
  8. // 添加重复键会抛出异常
  9. try
  10. {
  11.     openWith.Add("txt", "winword.exe");
  12. }
  13. catch (ArgumentException)
  14. {
  15.     Console.WriteLine("An element with Key = "txt" already exists.");
  16. }
  17. // 通过索引取值
  18. Console.WriteLine("For key = "rtf", value = {0}.",
  19.     openWith["rtf"]);
  20. // 给已存在的键值索引赋值
  21. openWith["rtf"] = "winword.exe";
  22. Console.WriteLine("For key = "rtf", value = {0}.",
  23.     openWith["rtf"]);
  24. // 如果不存在,则会新增
  25. openWith["doc"] = "winword.exe";
  26. // 如果访问一个不存在的索引值,则会抛出异常
  27. try
  28. {
  29.     Console.WriteLine("For key = "tif", value = {0}.",
  30.         openWith["tif"]);
  31. }
  32. catch (KeyNotFoundException)
  33. {
  34.     Console.WriteLine("Key = "tif" is not found.");
  35. }
  36. // tryValue 尝试取值
  37. string value = "";
  38. if (openWith.TryGetValue("tif", out value))
  39. {
  40.     Console.WriteLine("For key = "tif", value = {0}.", value);
  41. }
  42. else
  43. {
  44.     Console.WriteLine("Key = "tif" is not found.");
  45. }
  46. // 判断是否包含键
  47. if (!openWith.ContainsKey("ht"))
  48. {
  49.     openWith.Add("ht", "hypertrm.exe");
  50.     Console.WriteLine("Value added for key = "ht": {0}",
  51.         openWith["ht"]);
  52. }
  53. // 遍历循环,元素被检索为 KeyValuePair 对象
  54. Console.WriteLine();
  55. foreach( KeyValuePair<string, string> kvp in openWith )
  56. {
  57.     Console.WriteLine("Key = {0}, Value = {1}",
  58.         kvp.Key, kvp.Value);
  59. }
  60. // 获取所有的值集合
  61. Dictionary<string, string>.ValueCollection valueColl =
  62.     openWith.Values;
  63. // 遍历值集合
  64. Console.WriteLine();
  65. foreach( string s in valueColl )
  66. {
  67.     Console.WriteLine("Value = {0}", s);
  68. }
  69. // 获取所有的键集合
  70. Dictionary<string, string>.KeyCollection keyColl =
  71.     openWith.Keys;
  72. // 遍历键集合
  73. Console.WriteLine();
  74. foreach( string s in keyColl )
  75. {
  76.     Console.WriteLine("Key = {0}", s);
  77. }
  78. // 移除键值对
  79. Console.WriteLine("\nRemove("doc")");
  80. openWith.Remove("doc");
  81. if (!openWith.ContainsKey("doc"))
  82. {
  83.     Console.WriteLine("Key "doc" is not found.");
  84. }
复制代码
 
Dictionary泛型类提供从一组键到一组值的映射。 每次对字典的添加都包含一个值和与其关联的键。 通过使用其键检索值的速度非常快,接近 O (1) ,因为类 Dictionary 作为哈希表实现。
备注
检索速度取决于为 TKey类型指定的哈希算法的质量。
只要对象用作键, Dictionary它就不能以任何方式更改影响其哈希值。 每个键 Dictionary 都必须根据字典的相等比较器是唯一的。 如果键的类型是引用类型TValue,则键不能null,但值可以是。
Dictionary 需要相等实现来确定键是否相等。 可以使用接受comparer参数的构造函数指定泛型接口的IEqualityComparer实现;如果未指定实现,则使用默认泛型相等比较器EqualityComparer.Default。 如果类型 TKey 实现 System.IEquatable 泛型接口,则默认相等比较器使用该实现。
备注
例如,可以使用类提供的 StringComparer 不区分大小写的字符串比较器创建不区分大小写的字符串键的字典。
a Dictionary 的容量是可以保留的元素 Dictionary 数。 随着元素添加到 a Dictionary,通过重新分配内部数组,容量会自动增加。
线程安全性

只要集合未修改,A Dictionary 就可以同时支持多个读取器。 即便如此,通过集合进行遍历本质上不是线程安全的过程。 在遍历与写入访问竞争的极少数情况下,必须在整个遍历期间锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
有关线程安全的替代,请参阅 ConcurrentDictionary 类或 ImmutableDictionary 类。
 
7. ConcurrentDictionary 线程安全

表示可由多个线程同时访问的键/值对的线程安全集合。

  • TKey : 字典中的键的类型。
  • TValue :字典中的值的类型。
所有公共成员和受保护成员 ConcurrentDictionary 都是线程安全的,并且可以从多个线程并发使用。 但是,通过重写(包括扩展方法) ConcurrentDictionary 之一访问的成员不能保证线程安全,并且可能需要由调用方同步。
 
System.Collections.Generic.Dictionary与类一样,ConcurrentDictionary实现IDictionary接口。 此外, ConcurrentDictionary 还提供了几种方法用于在字典中添加或更新键/值对,如下表所述。
要执行此操作方法使用注意事项将新键添加到字典(如果字典中尚不存在)TryAdd如果字典中当前不存在该键,此方法将添加指定的键/值对。 该方法返回 true 或 false 取决于是否添加了新对。更新字典中现有键的值(如果该键具有特定值)TryUpdate此方法检查密钥是否具有指定的值,如果具有指定值,则使用新值更新密钥。 它类似于 CompareExchange 该方法,只不过它用于字典元素。无条件地将键/值对存储在字典中,并覆盖已存在的键的值索引器的 setter: dictionary[key] = newValue 将键/值对添加到字典,或者如果键已存在,请根据键的现有值更新键的值AddOrUpdate(TKey, Func, Func)-system-func((-0-1-1)))) - 或 - AddOrUpdate(TKey, TValue, Func)))AddOrUpdate(TKey, Func, Func)-system-func((-0-1-1)))) 接受Key和两个委托。 如果字典中不存在Key,它将使用第一个委托;它接受Key并返回应为Key添加的值。 如果密钥存在,它将使用第二个委托;它接受键及其当前值,并返回应为键设置的新值。 AddOrUpdate(TKey, TValue, Func))) 接受密钥、要添加的值和更新委托。 这与上一个重载相同,只不过它不使用委托来添加密钥。获取字典中键的值,将值添加到字典中,如果键不存在,则返回它GetOrAdd(TKey, TValue) - 或 - GetOrAdd(TKey, Func)))这些重载为字典中的键/值对提供延迟初始化,仅当它不存在时才添加值。 GetOrAdd(TKey, TValue) 如果键不存在,则采用要添加的值。 GetOrAdd(TKey, Func))) 获取一个委托,如果键不存在,将生成该值。所有这些操作都是原子操作,对于类上 ConcurrentDictionary 所有其他操作都是线程安全的。 唯一的例外是接受委托的方法,即 AddOrUpdateGetOrAdd。 若要对字典进行修改和写入操作, ConcurrentDictionary 请使用细粒度锁定来确保线程安全。 (字典上的读取操作以无锁方式执行。) 但是,这些方法的委托在锁外部调用,以避免在锁下执行未知代码时可能出现的问题。 因此,这些委托执行的代码不受操作的原子性的约束。
 
8. 思考题

利用特性,反射,扩展方法等知识,将一个枚举的特性描述,通过扩展方法封装到Dictionary 集合中。例如:
  1. Dictionary<string, string> openWith =
  2.     new Dictionary<string, string>();
  3. // 初始化数据,不能存在重复键
  4. openWith.Add("txt", "notepad.exe");
  5. openWith.Add("bmp", "paint.exe");
  6. openWith.Add("dib", "paint.exe");
  7. openWith.Add("rtf", "wordpad.exe");
  8. // 添加重复键会抛出异常
  9. try
  10. {
  11.     openWith.Add("txt", "winword.exe");
  12. }
  13. catch (ArgumentException)
  14. {
  15.     Console.WriteLine("An element with Key = "txt" already exists.");
  16. }
  17. // 通过索引取值
  18. Console.WriteLine("For key = "rtf", value = {0}.",
  19.     openWith["rtf"]);
  20. // 给已存在的键值索引赋值
  21. openWith["rtf"] = "winword.exe";
  22. Console.WriteLine("For key = "rtf", value = {0}.",
  23.     openWith["rtf"]);
  24. // 如果不存在,则会新增
  25. openWith["doc"] = "winword.exe";
  26. // 如果访问一个不存在的索引值,则会抛出异常
  27. try
  28. {
  29.     Console.WriteLine("For key = "tif", value = {0}.",
  30.         openWith["tif"]);
  31. }
  32. catch (KeyNotFoundException)
  33. {
  34.     Console.WriteLine("Key = "tif" is not found.");
  35. }
  36. // tryValue 尝试取值
  37. string value = "";
  38. if (openWith.TryGetValue("tif", out value))
  39. {
  40.     Console.WriteLine("For key = "tif", value = {0}.", value);
  41. }
  42. else
  43. {
  44.     Console.WriteLine("Key = "tif" is not found.");
  45. }
  46. // 判断是否包含键
  47. if (!openWith.ContainsKey("ht"))
  48. {
  49.     openWith.Add("ht", "hypertrm.exe");
  50.     Console.WriteLine("Value added for key = "ht": {0}",
  51.         openWith["ht"]);
  52. }
  53. // 遍历循环,元素被检索为 KeyValuePair 对象
  54. Console.WriteLine();
  55. foreach( KeyValuePair<string, string> kvp in openWith )
  56. {
  57.     Console.WriteLine("Key = {0}, Value = {1}",
  58.         kvp.Key, kvp.Value);
  59. }
  60. // 获取所有的值集合
  61. Dictionary<string, string>.ValueCollection valueColl =
  62.     openWith.Values;
  63. // 遍历值集合
  64. Console.WriteLine();
  65. foreach( string s in valueColl )
  66. {
  67.     Console.WriteLine("Value = {0}", s);
  68. }
  69. // 获取所有的键集合
  70. Dictionary<string, string>.KeyCollection keyColl =
  71.     openWith.Keys;
  72. // 遍历键集合
  73. Console.WriteLine();
  74. foreach( string s in keyColl )
  75. {
  76.     Console.WriteLine("Key = {0}", s);
  77. }
  78. // 移除键值对
  79. Console.WriteLine("\nRemove("doc")");
  80. openWith.Remove("doc");
  81. if (!openWith.ContainsKey("doc"))
  82. {
  83.     Console.WriteLine("Key "doc" is not found.");
  84. }
复制代码
 
要求 封装OrderStateEnum的扩展 方法 ToDictionary() ,得到一个Dictionary,效果如下
  1. Dictionary<int,string> dict = OrderStateEnum.ToDictionary();
复制代码
 
 配套视频链接:阶段三(上) C#高级 (cctalk.com) 

来源:https://www.cnblogs.com/xuyubing/archive/2023/11/22/17850532.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具