当前位置:
首页 > 编程开发 > Objective-C编程 >
-
构建反转排序的泛型字典类9—完善
制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
下载完整代码:http://file.ddvip.com/2008_10/1224750862_ddvip_7358.rar
9. 完善
大楼已经盖好,剩下的工作就是装修,装修好就可以入住了。从本文的题目得知,这是一个可反转排序的集合类,但我们只实现了降序插入功能,如果希望把升序转换为降序该怎么办呢?此例的解决方法是声明一个代表排序方向的属性Comparer,并加入一个sort方法,调用sort方法时根据Comparer属性进行排序:
private ListSortDirection _currentSortDirection = ListSortDirection.Descending;
public SortDirectionComparer<TKey> Comparer
{
get
{
return this._sortDirectionComparer;
}
}
public void Sort()
{
// 检查是否跟现有排序方向相同.
if (this._currentSortDirection != this._sortDirectionComparer.SortDirection)
{
// 如果不同,则进行反转.
Array.Reverse(this.keys, 0, this._size);
Array.Reverse(this.values, 0, this._size);
// 设置当前排序.
this._currentSortDirection = this._sortDirectionComparer.SortDirection;
}
}
其中SortDirectionComparer类是第二节所声明的类,请参考:
http://cgbluesky.blog.163.com/blog/static/241235582008113103320661/
接下来再增加一个剪除多余空间的功能:
//剪除多余空间
public void TrimExcess()
{
int num1 = (int)(this.keys.Length * 0.9);
if (this._size < num1)
{
this.Capacity = this._size;
}
}
当然,需要给Capacity属性添加set方法
public int Capacity //容量属性
{
get
{
return this.keys.Length;
}
set
{
this.InternalSetCapacity(value, true);
}
}
注意:这样的调整空间会导致另外开辟内存以重新存放元素。
好,最后的工作就是增加一些构造方法,比如指定排序方向,指定容量,以使得这个集合类的使用更为灵活:
//用于指定排序方向的构造方法
public ReversibleSortedList(SortDirectionComparer<TKey> comparer)
: this()
{
if (comparer != null)
{
this._sortDirectionComparer = comparer;
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
}
//用于指定字典的构造方法
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary)
: this(dictionary, (SortDirectionComparer<TKey>)null)
{
}
//用于指定初始容量的构造方法
public ReversibleSortedList(int capacity)
{
if (capacity < 0)
{
throw new ArgumentOutOfRangeException(
"capacity", "Non-negative number required");
}
this.keys = new TKey[capacity];
this.values = new TValue[capacity];
this._sortDirectionComparer = new SortDirectionComparer<TKey>();
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
//用于指定字典和排序方向的构造方法
//这个构造方法用于在指定集合中创建新的字典类
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary,
SortDirectionComparer<TKey> comparer)
: this((dictionary != null) ? dictionary.Count : 0, comparer)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
dictionary.Keys.CopyTo(this.keys, 0);
dictionary.Values.CopyTo(this.values, 0);
Array.Sort<TKey, TValue>(this.keys, this.values,
this._sortDirectionComparer);
this._size = dictionary.Count;
}
//用于指定容量和排序方向的构造方法
public ReversibleSortedList(int capacity, SortDirectionComparer<TKey> comparer)
: this(comparer)
{
this.Capacity = capacity;
}
好!添加测试代码:
static void Main()
{
ReversibleSortedList<string, string> rs = new ReversibleSortedList<string, string>();
//添加元素
rs.Add("3", "a");
rs.Add("1", "b");
rs.Add("2", "c");
rs.Add("6", "d");
rs.Add("5", "e");
rs.Add("4", "f");
//使用DictionaryEntry打印键/值
foreach (KeyValuePair<string, string> d in rs)
{
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("重新排序");
rs.Comparer.SortDirection = ListSortDirection.Ascending;
rs.Sort();
foreach (KeyValuePair<string, string> d in rs)
{
Console.WriteLine(d.Key + " " + d.Value);
}
}
运行结果:
ReversibleSortedList 1.0版本:完成
1 b
2 c
3 a
4 f
5 e
6 d
重新排序
6 a
5 e
4 f
3 a
2 c
1 b
10. 结束语
从翻译《C# Cookbook》中的泛型内容到翻译《Programming C#》中的泛型内容,再到写完这篇文章,一共写了129页的Word文档。当然,这里有很大一部份是代码。写到后面我自己都有些不耐烦了。呵呵,不管怎么说,能坚持做完一件事并不容易,现在坚持下来了总算是对自己有个交待,也值得庆贺。
读完这一系列文章,您应该对FCL中几个重要的集合接口已经非常熟悉了吧。现在去看FCL中几个集合类的源代码将不再困难,还犹豫什么,阅读源代码将会给您带来极大的提高!
//剪除多余空间
public void TrimExcess()
{
int num1 = (int)(this.keys.Length * 0.9);
if (this._size < num1)
{
this.Capacity = this._size;
}
}
当然,需要给Capacity属性添加set方法
public int Capacity //容量属性
{
get
{
return this.keys.Length;
}
set
{
this.InternalSetCapacity(value, true);
}
}
注意:这样的调整空间会导致另外开辟内存以重新存放元素。
好,最后的工作就是增加一些构造方法,比如指定排序方向,指定容量,以使得这个集合类的使用更为灵活:
//用于指定排序方向的构造方法
public ReversibleSortedList(SortDirectionComparer<TKey> comparer)
: this()
{
if (comparer != null)
{
this._sortDirectionComparer = comparer;
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
}
//用于指定字典的构造方法
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary)
: this(dictionary, (SortDirectionComparer<TKey>)null)
{
}
//用于指定初始容量的构造方法
public ReversibleSortedList(int capacity)
{
if (capacity < 0)
{
throw new ArgumentOutOfRangeException(
"capacity", "Non-negative number required");
}
this.keys = new TKey[capacity];
this.values = new TValue[capacity];
this._sortDirectionComparer = new SortDirectionComparer<TKey>();
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
//用于指定字典和排序方向的构造方法
//这个构造方法用于在指定集合中创建新的字典类
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary,
SortDirectionComparer<TKey> comparer)
: this((dictionary != null) ? dictionary.Count : 0, comparer)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
dictionary.Keys.CopyTo(this.keys, 0);
dictionary.Values.CopyTo(this.values, 0);
Array.Sort<TKey, TValue>(this.keys, this.values,
this._sortDirectionComparer);
this._size = dictionary.Count;
}
//用于指定容量和排序方向的构造方法
public ReversibleSortedList(int capacity, SortDirectionComparer<TKey> comparer)
: this(comparer)
{
this.Capacity = capacity;
}
下载完整代码:http://file.ddvip.com/2008_10/1224750862_ddvip_7358.rar
9. 完善
大楼已经盖好,剩下的工作就是装修,装修好就可以入住了。从本文的题目得知,这是一个可反转排序的集合类,但我们只实现了降序插入功能,如果希望把升序转换为降序该怎么办呢?此例的解决方法是声明一个代表排序方向的属性Comparer,并加入一个sort方法,调用sort方法时根据Comparer属性进行排序:
private ListSortDirection _currentSortDirection = ListSortDirection.Descending;
public SortDirectionComparer<TKey> Comparer
{
get
{
return this._sortDirectionComparer;
}
}
public void Sort()
{
// 检查是否跟现有排序方向相同.
if (this._currentSortDirection != this._sortDirectionComparer.SortDirection)
{
// 如果不同,则进行反转.
Array.Reverse(this.keys, 0, this._size);
Array.Reverse(this.values, 0, this._size);
// 设置当前排序.
this._currentSortDirection = this._sortDirectionComparer.SortDirection;
}
}
其中SortDirectionComparer类是第二节所声明的类,请参考:
http://cgbluesky.blog.163.com/blog/static/241235582008113103320661/
接下来再增加一个剪除多余空间的功能:
//剪除多余空间
public void TrimExcess()
{
int num1 = (int)(this.keys.Length * 0.9);
if (this._size < num1)
{
this.Capacity = this._size;
}
}
当然,需要给Capacity属性添加set方法
public int Capacity //容量属性
{
get
{
return this.keys.Length;
}
set
{
this.InternalSetCapacity(value, true);
}
}
注意:这样的调整空间会导致另外开辟内存以重新存放元素。
好,最后的工作就是增加一些构造方法,比如指定排序方向,指定容量,以使得这个集合类的使用更为灵活:
//用于指定排序方向的构造方法
public ReversibleSortedList(SortDirectionComparer<TKey> comparer)
: this()
{
if (comparer != null)
{
this._sortDirectionComparer = comparer;
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
}
//用于指定字典的构造方法
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary)
: this(dictionary, (SortDirectionComparer<TKey>)null)
{
}
//用于指定初始容量的构造方法
public ReversibleSortedList(int capacity)
{
if (capacity < 0)
{
throw new ArgumentOutOfRangeException(
"capacity", "Non-negative number required");
}
this.keys = new TKey[capacity];
this.values = new TValue[capacity];
this._sortDirectionComparer = new SortDirectionComparer<TKey>();
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
//用于指定字典和排序方向的构造方法
//这个构造方法用于在指定集合中创建新的字典类
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary,
SortDirectionComparer<TKey> comparer)
: this((dictionary != null) ? dictionary.Count : 0, comparer)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
dictionary.Keys.CopyTo(this.keys, 0);
dictionary.Values.CopyTo(this.values, 0);
Array.Sort<TKey, TValue>(this.keys, this.values,
this._sortDirectionComparer);
this._size = dictionary.Count;
}
//用于指定容量和排序方向的构造方法
public ReversibleSortedList(int capacity, SortDirectionComparer<TKey> comparer)
: this(comparer)
{
this.Capacity = capacity;
}
好!添加测试代码:
static void Main()
{
ReversibleSortedList<string, string> rs = new ReversibleSortedList<string, string>();
//添加元素
rs.Add("3", "a");
rs.Add("1", "b");
rs.Add("2", "c");
rs.Add("6", "d");
rs.Add("5", "e");
rs.Add("4", "f");
//使用DictionaryEntry打印键/值
foreach (KeyValuePair<string, string> d in rs)
{
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("重新排序");
rs.Comparer.SortDirection = ListSortDirection.Ascending;
rs.Sort();
foreach (KeyValuePair<string, string> d in rs)
{
Console.WriteLine(d.Key + " " + d.Value);
}
}
运行结果:
ReversibleSortedList 1.0版本:完成
1 b
2 c
3 a
4 f
5 e
6 d
重新排序
6 a
5 e
4 f
3 a
2 c
1 b
10. 结束语
从翻译《C# Cookbook》中的泛型内容到翻译《Programming C#》中的泛型内容,再到写完这篇文章,一共写了129页的Word文档。当然,这里有很大一部份是代码。写到后面我自己都有些不耐烦了。呵呵,不管怎么说,能坚持做完一件事并不容易,现在坚持下来了总算是对自己有个交待,也值得庆贺。
读完这一系列文章,您应该对FCL中几个重要的集合接口已经非常熟悉了吧。现在去看FCL中几个集合类的源代码将不再困难,还犹豫什么,阅读源代码将会给您带来极大的提高!
//剪除多余空间
public void TrimExcess()
{
int num1 = (int)(this.keys.Length * 0.9);
if (this._size < num1)
{
this.Capacity = this._size;
}
}
当然,需要给Capacity属性添加set方法
public int Capacity //容量属性
{
get
{
return this.keys.Length;
}
set
{
this.InternalSetCapacity(value, true);
}
}
注意:这样的调整空间会导致另外开辟内存以重新存放元素。
好,最后的工作就是增加一些构造方法,比如指定排序方向,指定容量,以使得这个集合类的使用更为灵活:
//用于指定排序方向的构造方法
public ReversibleSortedList(SortDirectionComparer<TKey> comparer)
: this()
{
if (comparer != null)
{
this._sortDirectionComparer = comparer;
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
}
//用于指定字典的构造方法
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary)
: this(dictionary, (SortDirectionComparer<TKey>)null)
{
}
//用于指定初始容量的构造方法
public ReversibleSortedList(int capacity)
{
if (capacity < 0)
{
throw new ArgumentOutOfRangeException(
"capacity", "Non-negative number required");
}
this.keys = new TKey[capacity];
this.values = new TValue[capacity];
this._sortDirectionComparer = new SortDirectionComparer<TKey>();
this._currentSortDirection = _sortDirectionComparer.SortDirection;
}
//用于指定字典和排序方向的构造方法
//这个构造方法用于在指定集合中创建新的字典类
public ReversibleSortedList(IDictionary<TKey, TValue> dictionary,
SortDirectionComparer<TKey> comparer)
: this((dictionary != null) ? dictionary.Count : 0, comparer)
{
if (dictionary == null)
{
throw new ArgumentNullException("dictionary");
}
dictionary.Keys.CopyTo(this.keys, 0);
dictionary.Values.CopyTo(this.values, 0);
Array.Sort<TKey, TValue>(this.keys, this.values,
this._sortDirectionComparer);
this._size = dictionary.Count;
}
//用于指定容量和排序方向的构造方法
public ReversibleSortedList(int capacity, SortDirectionComparer<TKey> comparer)
: this(comparer)
{
this.Capacity = capacity;
}
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数