扩展方法在索引型泛型列表排序中的应用

在编程中,经常需要对现有的类型添加新的方法,但又不想通过继承或者重新编译的方式来实现。在C#中,扩展方法(Extension Methods)提供了一种解决方案。扩展方法是一种特殊的静态方法,它们允许为现有的类型添加方法,而不需要修改原有代码。LINQ查询操作符就是扩展方法的一个例子,它为IEnumerable和IEnumerable接口添加了查询功能。

索引型泛型列表的排序

C#中,System.Array、System.Collections.ArrayList和System.Collections.Generic.List类型都提供了Sort方法,使得对这些类型的列表进行排序变得非常简单。然而,对于实现了System.Collections.Generic.IList接口的索引型集合,却发现缺少了Sort方法。

要对这些类型的列表进行排序,通常需要将集合转换为上述支持Sort方法的类型,或者实现自己的排序算法。这时,扩展方法的概念就派上了用场。可以创建一个扩展方法,它适用于所有实现了IList接口的类型,并且可以像ArrayList示例中那样使用。

扩展方法在静态类中实现,并且第一个参数前需要有this修饰符,后面跟着要扩展的类型。以下是一个使用扩展方法实现的冒泡排序算法的示例:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Extensions { public static class SortingExtensionProvider { public static void Sort(this IList list) where T : IComparable { Sort(list, 0, list.Count - 1); } public static void Sort(this IList list, int startIndex, int endIndex) where T : IComparable { for (int i = startIndex; i < endIndex; i++) { for (int j = endIndex; j > i; j--) { if (list[j].IsLesserThan(list[j - 1])) { list.Exchange(j, j - 1); } } } } private static void Exchange(this IList list, int index1, int index2) { T tmp = list[index1]; list[index1] = list[index2]; list[index2] = tmp; } private static bool IsLesserThan(this IComparable value, IComparable item) { return value.CompareTo(item) < 0; } } }

需要注意的是,Exchange和IsLesserThan也是扩展方法,但它们只在SortingExtensionProvider类内部可见。

通过使用using Extensions;指令,IList将获得一个额外的Sort方法(确切地说是两个)。这样,就可以在不修改原有类型的情况下,为索引型泛型列表添加排序功能。

2008年7月25日:更新了扩展方法的实现细节。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485