代码块 12. 使用 System.Array 的一般方法
int[] numbers = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; Action trace = delegate(int number) { Trace.WriteLine(number); }; Predicate isPrime = delegate(int number) { switch(number) { case 1:case 2:case 3:case 5:case 7: case 11:case 13:case 17:case 19: return true; default: return false; } }; Array.ForEach(numbers,trace); int[] primes = Array.FindAll(numbers,isPrime); Array.ForEach(primes,trace);
在 System.Collections.Generic 命名空间中定义的类 List 中,也可以得到类似的一般方法。这些方法使用四个相同的一般委托。实际上,您还可以在您的代码中利用这些委托,如以下部分所示。
静态集合类
尽管 System.Array 和 List 都提供了能够大大简化自身使用方式的、方便的实用工具方法,但 .NET 没有为其他集合提供这样的支持。为了对此进行补偿,本文随附的源代码包含了静态 Helper 类 Collection,其定义如下所示:
public static class Collection { public static IList AsReadOnly(IEnumerable collection); public static U[] ConvertAll(IEnumerable collection, Converter converter); public static bool Contains(IEnumerable collection,T item) where T : IComparable; public static bool Exists(IEnumerable collection,Predicate); public static T Find(IEnumerable collection,Predicate match); public static T[] FindAll(IEnumerable collection, Predicate match); public static int FindIndex(IEnumerable collection,T value) where T : IComparable; public static T FindLast(IEnumerable collection, Predicate match); public static int FindLastIndex(IEnumerable collection,T value) where T : IComparable; public static void ForEach(IEnumerable collection,Action action); public static T[] Reverse(IEnumerable collection); public static T[] Sort(IEnumerable collection); public static T[] ToArray(IEnumerable collection); public static bool TrueForAll(IEnumerable collection, Predicate match); //Overloaded versions for IEnumerator }
Collection 的实现简单易懂。例如,以下为 ForEach() 方法:
public static void ForEach(IEnumerator iterator,Action action) { /* Some parameter checking here, then: */ while(iterator.MoveNext()) { action(iterator.Current); } }
Collection 静态类的用法非常类似于 Array 和 List,它们都利用相同的一般委托。您可以将 Collection 用于任何集合,只要该集合支持 IEnumerable 或 IEnumerator:
Queue queue = new Queue(); //Some code to initialize queue Action trace = delegate(int number) { Trace.WriteLine(number); }; Collection.ForEach(queue,trace);
|