SortedList表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
SortedList在内部维护两个数组以将数组存储到列表中;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为DictionaryEntry对象进行访问的键/值对。键不能为空引用(VisualBasic中为Nothing),但值可以。SortedList的容量是列表可拥有的元素数。随着向SortedList中添加元素,容量通过重新分配按需自动增加。可通过调用TrimToSize或通过显式设置Capacity属性减少容量。SortedList的元素将按照特定的IComparer实现(在创建SortedList时指定)或按照键本身提供的IComparable实现并依据键来进行排序。不论在哪种情况下,SortedList都不允许重复键。
索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入SortedList,同时索引会相应地进行调整。若移除了元素,索引也会相应地进行调整。因此,当在SortedList中添加或移除元素时,特定键/值对的索引可能会更改。
虽然SortedList和Hashtable都是键/值对集合,但SortedList是自动排序的,所以速度没有Hashtable块,但前者支持键和索引的对值的访问,而Hashtable只支持键对值的访问,所以SortedList显得更加灵活。 SortedList和Hashtable一样,可以保存任意类型数据,
SortedList集合中的元素类型是DictionaryEntry,了解这一点对于遍历集合中的元素非常关键。
SortedList类的语法定义如下:
[SerializableAttribute] [ComVisibleAttribute(true)] public class SortedList:IDictionary,ICollection,IEnumerable,ICloneale
其继承了IDictionary,ICollection和IEnumerable接口,具备字典、集合和枚举的一些通用的方法。SortedLIst对象的构造方法有6中,通常使用最简单的方法来构造,代码如下:
SortedList的构造器
构造器函数 |
注释 |
初始化 SortedList 类的新实例,该实例为空、具有默认初始容量并根据 |
|
初始化 SortedList 类的新实例,该实例包含从指定字典复制的元素、具有与所复制的元素数相同的初始容量并根据由每个键实现的 IComparable 接口排序。 |
|
初始化 SortedList 类的新实例,该实例为空、具有指定的初始容量并根据 IComparable 接口(此接口由添加到 SortedList 中的每个键实现)进行排序。 |
SortedList mysorted = new SortedList();
namespace MySortedList { class Program { static void Main(string[] args) { // 创建一个SortedList对象 SortedList mySortedList = new SortedList(); mySortedList.Add("First", "Hello"); mySortedList.Add("Second", "World"); mySortedList.Add("Third", "!"); mySortedList.Add("Four", "{1}quot;); //列举SortedList的属性、键、值 Console.WriteLine("MySortedList"); Console.WriteLine(" Count: {0}", mySortedList.Count); Console.WriteLine(" Capacity: {0}", mySortedList.Capacity); Console.WriteLine(" Keys and Values:"); PrintIndexAndKeysAndValues(mySortedList); #region SortedList获得键、值列表 SortedList mySortedList1 = new SortedList(); mySortedList1.Add(1.3, "fox"); mySortedList1.Add(1.4, "jumped"); mySortedList1.Add(1.5, "over"); mySortedList1.Add(1.2, "brown"); mySortedList1.Add(1.1, "quick"); mySortedList1.Add(1.0, "The"); mySortedList1.Add(1.6, "the"); mySortedList1.Add(1.8, "dog"); mySortedList1.Add(1.7, "lazy"); //获得指定索引处的键和值 int myIndex = 3; // 获取 System.Collections.SortedList 对象的指定索引处的键 Console.WriteLine("The key at index {0} is {1}.", myIndex, mySortedList1.GetKey(myIndex)); // 获取 System.Collections.SortedList 对象的指定索引处的值 Console.WriteLine("The value at index {0} is {1}.", myIndex, mySortedList1.GetByIndex(myIndex)); // 获得SortedList中的键列表和值列表 IList myKeyList = mySortedList1.GetKeyList(); IList myValueList = mySortedList1.GetValueList(); // Prints the keys in the first column and the values in the second column. Console.WriteLine("\t-KEY-\t-VALUE-"); for (int i = 0; i < mySortedList1.Count; i++) Console.WriteLine("\t{0}\t{1}", myKeyList[i], myValueList[i]); #endregion #region 为SortedList中的元素重新赋值 // Creates and initializes a new SortedList. SortedList mySortedList2 = new SortedList(); mySortedList2.Add(2, "two"); mySortedList2.Add(3, "three"); mySortedList2.Add(1, "one"); mySortedList2.Add(0, "zero"); mySortedList2.Add(4, "four"); // 打印显示列表的键和值 Console.WriteLine("The SortedList contains the following values:"); PrintIndexAndKeysAndValues(mySortedList2); // 获得指定键的索引 int myKey = 2; Console.WriteLine("The key \"{0}\" is at index {1}.", myKey, mySortedList2.IndexOfKey(myKey)); // 获得指定值的索引 String myValue = "three"; Console.WriteLine("The value \"{0}\" is at index {1}.", myValue, mySortedList2.IndexOfValue(myValue)); // 重新设置指定索引处的值 mySortedList2.SetByIndex(3, "III"); // SetByIndex:替换 System.Collections.SortedList 对象中指定索引处的值 mySortedList2.SetByIndex(4, "IV"); //打印显示列表的键和值 Console.WriteLine("After replacing the value at index 3 and index 4,"); PrintIndexAndKeysAndValues(mySortedList2); #endregion Console.ReadKey(); } //打印SortedList中的键和值 public static void PrintIndexAndKeysAndValues(SortedList myList) { Console.WriteLine("\t-INDEX-\t-KEY-\t-VALUE-"); for (int i = 0; i < myList.Count; i++) { Console.WriteLine("\t[{0}]:\t{1}\t{2}", i, myList.GetKey(i), myList.GetByIndex(i)); } Console.WriteLine(); } } }
程序结果:
泛型集合SortedList<TKey,TValue>:
如果需要排好序的表,可以使用SortedList<TKey,TValue>。这个类按照键给元素排序。
下面的例子创建一个有序表,其中键和值都是string类型。默认的构造函数创建了一个空表,再用Add()方法添加两本书。使用重载的构造函数,可以定义有序表的容量,传送执行了IComparer<TKey>接口的对象,用于给有序表中得元素排序。
Add()方法的第一个参数是键(书名),第二个参数是值(ISBN号)。除了使用Add()方法之外,还可以使用索引器将元素添加到有序表中。索引器需要把键作为索引参数。如果键已存在,那么Add()方法就抛出一个ArgumentException类型的异常。如果索引器使用相同的键,就用新值替代旧值。
SortedList<string, string> books = new SortedList<string, string>(); books.Add(".net 2.0 Wrox Box", "978-0-470-04840-5"); books.Add("Professional C# 2008", "978-0-472-04840-6"); books["Java SE Professional"] = "978-0-473-04840-8"; books["C++ book"] = "978-0-470-04840-0"; foreach (KeyValuePair<string, string> book in books) { Console.WriteLine("{0},{1}", book.Key, book.Value); }
可以使用foreach语句迭代有序表。枚举器返回的元素是KeyValuePair<TKey,TValue>类型,其中包含了键和值。键可以用Key属性访问,值用Value属性访问。
也可以使用Values和Keys属性访问值和键。Values属性返回IList<TValue>,Keys属性返回IList<TKey>,所以,可以在foreach中使用这些属性:
foreach (string isbn in books.Values) { Console.WriteLine(isbn); } foreach (string title in books.Keys) { Console.WriteLine(title); }
如果不是泛型集合的SortedList,每个元素都是一个可作为 DictionaryEntry对象进行访问的键/值对。
SortedList books1 = new SortedList();
books1.Add(".net 2.0 Wrox Box", "978-0-470-04840-5");
books1.Add("Professional C# 2008", "978-0-472-04840-6");
books1["Java SE Professional"] = "978-0-473-04840-8";
books1["C++ book"] = "978-0-470-04840-0";
foreach (DictionaryEntry de in books1)
{
Console.WriteLine("{0},{1}", de.Key, de.Value);
}