《C#本质论》读书笔记(16)构建自定义集合

Posted 【唐】三三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C#本质论》读书笔记(16)构建自定义集合相关的知识,希望对你有一定的参考价值。

16.1 更多集合接口

集合类(这里指IEnumerable层次结构)实现的接口层次结构



16.1.1 IList<T>与IDictionary<TKey,TValue>

字典类一般只按照键进行索引,而不按位置索引。
列表“键”总是一个整数,“键集”总是从0开始的非负整数的一个连续集合。
解决数据存储或数据获取问题时,考虑  IList<T>(侧重位置索引获取值)与 IDictionary<TKey,TValue>(侧重通过键来获取值)。

16.1.2 ICompatable<T>

ICompatable<T>是实现排序的关键。
例如, List<T>.Sort() ,你需要采取某种方式比较对象,一个办法就是使用 ICompatable<T> 接口。该接口有一个 CompareTo() 方法,返回一个整数,指出传递元素是大于、小于还是等于当前元素,所以,键的数据类型必须实现 ICompatable<T> 


高级主题:用IComparer<T>排序

      为了实现自定义排序,另一个方法是向排序方法传递实现了 IComparer<T> 的元素。集合中的元素通常不支持这个接口。
    IComparable<T>  IComparer<T> 的区别很细微,但重要。
IComparable<T> 说:“我知道如何将自己和我的类型的另一个实例进行比较
IComparer<T> 说:“我知道如何比较给定类型的两个实例

  1. public static void Main()    

  2. {    

  3.     Contact aaa = new Contact() { LastName = "bbb", FirstName = "ddd" };    

  4.     Contact bbb = new Contact() { LastName = "aaa", FirstName = "ccc" };    

  5.     

  6.     //Console.WriteLine(new NameComparison().Compare(aaa, bbb));    

  7.     

  8.     List<Contact> contactlist = new List<Contact>();    

  9.     contactlist.Add(aaa);    

  10.     contactlist.Add(bbb);    

  11.     

  12.     foreach (var contact in contactlist)    

  13.     {    

  14.         Console.WriteLine(contact.LastName + " ");    

  15.     }    

  16.     //排序    

  17.     contactlist.Sort(new NameComparison());    

  18.     

  19.     foreach (var contact in contactlist)    

  20.     {    

  21.         Console.WriteLine(contact.LastName + " ");    

  22.     }    

  23.     

  24.     Console.Read();    

  25.     

  26. }    

  27.     

  28. class Contact    

  29. {    

  30.     public string FirstName { getset; }    

  31.     public string LastName { getset; }    

  32. }    

  33.     

  34.     

  35. class NameComparison : IComparer<Contact>    

  36. {    

  37.     public int Compare(Contact x, Contact y)    

  38.     {    

  39.         int result;    

  40.     

  41.         if (Contact.ReferenceEquals(x, y))    

  42.         {    

  43.             result = 0;    

  44.         }    

  45.         else    

  46.         {    

  47.             if (x == null)    

  48.             {    

  49.                 result = 1;    

  50.             }    

  51.             else if (y == null)    

  52.             {    

  53.                 result = -1;    

  54.             }    

  55.             else    

  56.             {    

  57.                 result = StringCompare(x.LastName, y.LastName);    

  58.                 if (result == 0)    

  59.                 {    

  60.                     result =    

  61.                         StringCompare(x.FirstName, y.FirstName);    

  62.                 }    

  63.             }    

  64.         }    

  65.         return result;    

  66.     }    

  67.     

  68.     private static int StringCompare(string x, string y)    

  69.     {    

  70.         int result;    

  71.         if (x == null)    

  72.         {    

  73.             if (y == null)    

  74.             {    

  75.                 result = 0;    

  76.             }    

  77.             else    

  78.             {    

  79.                 result = 1;    

  80.             }    

  81.         }    

  82.         else    

  83.         {    

  84.             result = x.CompareTo(y);    

  85.         }    

  86.         return result;    

  87.     }    

  88. }    


16.2 主要集合类

共有5类关键的集合类,所有泛型类都位于 System.Collections.Generic命名空间。

16.2.1 列表集合:List<T>

List<T>具有与数组相似的属性。关键在于会自动的扩展,也可以显示调用 TrimToSize() 或 Capacity 来缩小。

  1. List<string> list = new List<string>();  

  2.      

  3. // Lists automatically expand as elements  

  4. // are added.  

  5. list.Add("Sneezy");  

  6. list.Add("Happy");  

  7. list.Add("Dopey");  

  8. list.Add("Doc");  

  9. list.Add("Sleepy");  

  10. list.Add("Bashful");  

  11. list.Add("Grumpy");  

  12.      

  13. list.Sort();  

  14.      

  15. Console.WriteLine(  

  16.     "In alphabetical order {0} is the "  

  17.     + "first dwarf while {1} is the last.",  

  18.     list[0], list[6]);  

  19.      

  20. list.Remove("Grumpy");  


16.2.3 搜索List<T>

要在 List<T> 查找特定的元素,可以使用 Contains()  IndexOf()  LastIndexOf()  BinarySerch() 方法。
   BinarySerch() 采用的是快得多的二分搜索算法,但要求元素已经排序好。一个有用的功能是假如元素没找到,会返回一个负整数。该值的按位取反(~)结果是”大于被查找元素的下一个元素“的索引,如果没有更大的值,则是元素的总数。这样就可以在特定位置方便插入新值。
  1. List<string> list = new List<string>();  

  2. int search;  

  3.   

  4. list.Add("public");  

  5. list.Add("protected");           

  6. list.Add("private");  

  7.   

  8.   

  9. list.Sort();  

  10.   

  11. search = list.BinarySearch("protected internal");  

  12. if (search < 0)  

  13. {  

  14.     list.Insert(~search, "protected internal");  

  15. }  

  16.   

  17. foreach (string accessModifier in list)  

  18. {  

  19.     Console.WriteLine(accessModifier);  

  20. }  


高级主题:使用 FindAll() 查找多个数据项

   FindAll() 获取 Predicate<T> 类型的一个参数,它是对称为“委托”的一个方法的引用