电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

构建可反转排序泛型字典类(2)--排序方向


发布日期:2020/3/15
 

排序方向

你希望ReversibleSortedList类中的元素是以TKey(键)的顺序进行存储的并且它即可以从小排到大也可以从大排到小当然最佳方式就是在添加元素时找到合适的位置插入插入后元素就已经按顺序排好在一个有序数组中查找合适的插入点这样的算法并不困难但FCL已经帮我们实现了而且是采用速度最快的二分查找法(在MSDN中被称为二进制搜索法太棒了!它就是静态方法ArrayBinarySearch下面我们来看MSDN中对它的介绍

ArrayBinarySearch一共有个重载版本最后一个是我们需要的

public static int BinarySearch (

T[] array //要搜索的从零开始的一维排序 Array

int index //要搜索的范围的起始索引

int length //要搜索的范围的长度

T value //要搜索的对象

IComparer comparer //比较元素时要使用的 IComparer 实现

)

其中T表示数组元素的类型对返回值的介绍是如果找到 value则为指定 array 中的指定 value 的索引如果找不到 value 且 value 小于 array 中的一个或多个元素则为一个负数该负数是大于 value 的第一个元素的索引的按位求补如果找不到 value 且 value 大于 array 中的任何元素则为一个负数该负数是最后一个元素的索引加 的按位求补

我们的ReversibleSortedList不能插入重复的键值当返回值大于或等于表明不能插入当返回值小于零时表明没有找到重复键而且这时返回值还带有插入位置的信息考虑得可真周到啊赞一个!

求补是什么呢?就是把二进制数的变成变成对于int来说由于它是有符号整数求补会把正数变为负数把负数变为正数对一个数进行两次求补运算就会得到原来的数哈哈如果反回值小于对它求补就可以得到插入位置信息了真是得来全不费工夫!

现在的问题是需要一个实现了IComparer接口的类可以在ReversibleSortedList声明一个嵌套类以解决这个问题当然在实现IComparer接口的Compare方法时在里面做些手脚就可以实现正向和反向排序了这时需要一个能表示正向和反向排序的东西FCL里有现成的它就是SystemComponentModel命名空间下的 ListSortDirection枚举它有两个值Ascending表示升序Descending表示降序下面的代码在版本的基础上添加了实现IComparer接口的内部类SortDirectionComparer代码可直接拷贝运行运行它纯粹是为了检查是否有错误没有什么看得见的效果

ReversibleSortedList 版本添加了实现IComparer接口的内部类

using System;

using SystemCollections;

using SystemCollectionsGeneric;

using SystemComponentModel;

public class ReversibleSortedList

{

#region 成员变量

private TKey[] keys=new TKey[]; //键数组

private TValue[] values; //值数组

private static TKey[] emptyKeys;

private static TValue[] emptyValues;

#endregion

#region 构造方法

//类型构造器

static ReversibleSortedList()

{

ReversibleSortedListemptyKeys = new TKey[];

ReversibleSortedListemptyValues = new TValue[];

}

public ReversibleSortedList()

{

thiskeys = ReversibleSortedListemptyKeys;

thisvalues = ReversibleSortedListemptyValues;

}

#endregion

#region 公有属性

public int Capacity //容量属性

{

get

{

return thiskeysLength;

}

}

#endregion

#region SortDirectionComparer类定义

public class SortDirectionComparer : IComparer

{ //ListSortDirection 枚举有两个值

//Ascending按升序排列Descending按降序排列

private SystemComponentModelListSortDirection _sortDir;

//构造方法

public SortDirectionComparer()

{ //默认为升序

_sortDir = ListSortDirectionAscending;

}

//可指定排序方向的构造方法

public SortDirectionComparer(ListSortDirection sortDir)

{

_sortDir = sortDir;

}

//排序方向属性

public SystemComponentModelListSortDirection SortDirection

{

get { return _sortDir; }

set { _sortDir = value; }

}

//实现IComparer接口的方法

public int Compare(T lhs T rhs)

{

int compareResult =

lhsToString()CompareTo(rhsToString());

// 如果是降序则反转

if (SortDirection == ListSortDirectionDescending)

compareResult *= ;

return compareResult;

}

}

#endregion

}

public class Test

{

static void Main()

{

ReversibleSortedList rs=new ReversibleSortedList();

ConsoleWriteLine(rsCapacity);

}

}

上一篇:从进程得到该进程关联图标的方法

下一篇:自定义反射的示例