Welcome

首页 / 软件开发 / C# / C#泛型秘诀(5.1)

C#泛型秘诀(5.1)2011-03-254.8 反转Sorted List里的内容

问题

您希望在数组和列表类型中可以反转sorted list里的内容同时又维持SortedList和SortedList<T>类原来的功能。无论是SortedList还是泛型SortedList<T>类都直接提供了完成这个功能的方法而又不需要重填列表。

解决方案

ReversibleSortedList<TKey, TValue>类提供了这些功能,它基于SortedList<TKey, TValue>类,所以拥有相同的功能,它提供了额外的功能是很容易反转已排序的列表。

在实例化ReversibleSortedList<TKey, TValue>之后,键是整数类型,值是字符串类型,一连串无序的数字和它们的文本表达被插入到列表中。这些项目是这样显示的:

ReversibleSortedList<int, string> rsl = new ReversibleSortedList<int, string>();
rsl.Add(2, "2");
rsl.Add(5, "5");
rsl.Add(3, "3");
rsl.Add(1, "1");
foreach (KeyValuePair<int, string> kvp in rsl)
{
Debug.WriteLine(" " + kvp.Key + " " + kvp.Value);
}

列表输出显示为按升序排序(默认):

1 12 23 35 5
现在排列顺序通过设置ReversibleSortedList的SortDirection属性被反转为降序。为了重新排序需要调用Sort()方法。结果如下:

// 转换排序方向.
rsl.Comparer.SortDirection = ListSortDirection.Descending;
// 重排列表.
rsl.Sort();
foreach (KeyValuePair<int, string> kvp in rsl)
{
Debug.WriteLine(" " + kvp.Key + " " + kvp.Value);
}

这一次,输出为降序:

5 53 32 21 1
当把一个新项添加进列表,它将按当前的排列顺序被添加进去,但在添加完所有项后马上进行反转,就可以保持列表中元素的顺序。

rsl.Add(4, "4");foreach (KeyValuePair<int, string> kvp in rsl){Debug.WriteLine("	" + kvp.Key + "	" + kvp.Value);}// 转换排序方向.rsl.Comparer.SortDirection = ListSortDirection.Ascending;// 重排列表.rsl.Sort();foreach (KeyValuePair<int, string> kvp in rsl){Debug.WriteLine("	" + kvp.Key + "	" + kvp.Value);}
可以看到新项即按降序也按升序排列:

5 54 43 32 21 11 12 23 34 45 5