中辽普坦的专栏

专注系统架构、数据库技术和领域驱动设计(Share my knowledge with the world.)

SortedList 详解

  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 中的每个键实现)进行排序。

SortedList (IDictionary)

初始化 SortedList 类的新实例,该实例包含从指定字典复制的元素、具有与所复制的元素数相同的初始容量并根据由每个键实现的 IComparable 接口排序。

SortedList (Int32)

初始化 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);
            }



 

阅读更多
个人分类: C# Basic
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭