跳转到内容

.NET 开发基金会/使用泛型集合

来自维基教科书,开放的书籍,开放的世界


系统类型和集合:使用泛型集合


使用泛型集合

[编辑 | 编辑源代码]

考试目标:通过使用泛型集合,提高 .NET Framework 应用程序的类型安全性和应用程序性能。

(参考 System.Collections.Generic 命名空间 MSDN )

Collection.Generic 接口

[编辑 | 编辑源代码]
泛型 IComparable 接口 - MSDN
请注意,IComparable<T> 是 System 命名空间的成员。
当您创建一个类并希望它与支持排序的泛型类型(例如 SortedList<T> 或 List<T>.Sort())一起使用时,您将使用此接口,而无需指定比较器对象。IComparable<T> 的唯一方法是 CompareTo<T>(T other)。MSDN 上有一个示例。
以下示例为自定义的 Point 类实现 IComparable<T>。该示例使用 List<T> 而不是 SortedList<T> 或 OrderedDictionnary<T>,因为比较是根据点到原点的距离进行的,对于许多点来说,距离值可能相同。
简单使用 IComparable<T> (C#)

简单使用 IComparable<T> (C#)

   using System;
   using System.Collections.Generic;
   using System.Text;
   namespace GenericsLab05
   {
       class Program
       {
           static void Main(string[] args)
           {
               List<Point> lst = new List<Point>();
               lst.Add(new Point(-2, -2));
               lst.Add(new Point(1, 1));
               lst.Add(new Point(2, 2));
               // Sort uses IComparable of Point
               lst.Sort();
               foreach (Point pt in lst)
               {
                   Console.WriteLine(pt.ToString());
               }
               // Wait to finish
               Console.WriteLine("Press ENTER to finish");
               Console.ReadLine();
           }
       }
       // This is out custom version of a point
       public struct Point : IComparable<Point>
       {
           public double x;
           public double y;
           public Point(double px, double py)
           {
               x = px;
               y = py;
           }
           // Comparaison done based on distance from origin
           public int CompareTo(Point other)
           {
               return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)).CompareTo
                   (Math.Sqrt(Math.Pow(other.x, 2) + Math.Pow(other.y, 2)));
           }
           public override string ToString()
           {
               return "(" + x.ToString() + "," + y.ToString() + ")";
           }
       }
   }
泛型 ICollection 接口和泛型 IList 接口
泛型 ICollection 接口 - MSDN
泛型 IList 接口 - MSDN
泛型 IComparer 接口和泛型 IEqualityComparer 接口
泛型 IComparer 接口 - MSDN
泛型 IEqualityComparer 接口 - MSDN
泛型 IDictionary 接口 - MSDN
泛型 IEnumerable 接口和泛型 IEnumerator 接口
泛型 IEnumerable 接口 - MSDN
另请参见 ONDotnet
泛型 IEnumerator 接口 - MSDN
IHashCodeProvider 接口 - MSDN - 该接口现已过时(从 .NET 2.0 开始)
泛型字典
[编辑 | 编辑源代码]
泛型字典类和泛型字典.枚举器结构
泛型字典类 - MSDN
泛型字典.枚举器结构 - MSDN
泛型字典.键集合类和字典.键集合.枚举器结构
泛型字典.键集合类 - MSDN
字典.键集合.枚举器结构 - MSDN
泛型字典.值集合类和字典.值集合.枚举器结构
泛型字典.值集合类 - MSDN
字典.值集合.枚举器结构 - MSDN

泛型比较器类和泛型相等比较器类

[编辑 | 编辑源代码]
泛型比较器类 - MSDN
Comparer<T> 类用作基类,可以轻松地实现 IComparer<T> 接口。
该示例与 IComparable<T> 相同,只是现在将派生的 Comparer<T> 对象传递给 List<T>.Sort() 方法,而不是在 Point 上实现 IComparable<T> 接口。
这种处理方式有两个优点:
  • 即使您无法访问 Point 的源代码,也可以使用它。
  • 您可以为同一个 Point 类创建多个派生的比较器类。
自定义 Comparer<T> (C#)

自定义 Comparer<T> (C#)

   using System;
   using System.Collections.Generic;
   using System.Text;
   namespace GenericsLab06
   {
       class Program
       {
           static void Main(string[] args)
           {
               List<Point> lst = new List<Point>();
               lst.Add(new Point(-2, -2));
               lst.Add(new Point(1, 1));
               lst.Add(new Point(2, 2));
               // Sort uses IComparable of Point
               lst.Sort(new DistanceComparer());
               foreach (Point pt in lst)
               {
                   Console.WriteLine(pt.ToString());
               }
               // Wait to finish
               Console.WriteLine("Press ENTER to finish");
               Console.ReadLine();
           }
       }
       // This is out custom version of a point
       public struct Point 
       {
           public double x;
           public double y;
           public Point(double px, double py)
           {
               x = px;
               y = py;
           }
           public override string ToString()
           {
               return "(" + x.ToString() + "," + y.ToString() + ")";
           }
       }
       // Derive from base comparer class to implement IComparer<T>
       public class DistanceComparer : Comparer<Point>
       {
           public override int Compare(Point p1, Point p2)
           {
               return Math.Sqrt(Math.Pow(p1.x, 2) + Math.Pow(p1.y, 2)).CompareTo
                   (Math.Sqrt(Math.Pow(p2.x, 2) + Math.Pow(p2.y, 2)));
           }
       }
   }
泛型相等比较器类 - MSDN

泛型 KeyValuePair 结构

[编辑 | 编辑源代码]
参见 MSDN

泛型列表类、泛型列表.枚举器结构和泛型排序列表类

[编辑 | 编辑源代码]
泛型列表类 - MSDN
泛型列表类实例只需使用 List<T> 语法声明,其中 T 是特定类型。
泛型列表.枚举器结构 - MSDN
泛型排序列表类 - MSDN

泛型队列类和泛型队列.枚举器结构

[编辑 | 编辑源代码]
泛型队列类 - MSDN
泛型队列.枚举器结构 - MSDN

泛型排序字典类

[编辑 | 编辑源代码]
参见 MSDN
有关排序列表和排序字典之间差异的解释,请参见 MSDN

泛型链表

[编辑 | 编辑源代码]
泛型链表表示一个双向链表,是一个通用的链表。它支持枚举器并实现 ICollection 接口,与 .NET Framework 中的其他类一致。
泛型链表类 - MSDN
泛型链表.枚举器结构 - MSDN
泛型链表节点类 - MSDN

泛型栈类和泛型栈.枚举器结构

[编辑 | 编辑源代码]
泛型栈类 - MSDN
泛型栈.枚举器结构 - MSDN
华夏公益教科书