C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

11.7 有序列表

如果需要基于键对所需集合排序,就可以使用SortedList<TKey, TValue>类。这个类按照键给元素排序。这个集合中的值和键都可以使用任意类型。

下面的例子创建了一个有序列表,其中键和值都是string类型。默认的构造函数创建了一个空列表,再用Add()方法添加两本书。使用重载的构造函数,可以定义列表的容量,传递实现了IComparer<TKey>接口的对象,该接口用于给列表中的元素排序。

Add()方法的第一个参数是键(书名),第二个参数是值(ISBN号)。除了使用Add()方法之外,还可以使用索引器将元素添加到列表中。索引器需要把键作为索引参数。如果键已存在,Add()方法就抛出一个ArgumentException类型的异常。如果索引器使用相同的键,就用新值替代旧值(代码文件SortedListSample/Program.cs)。

        var books = new SortedList<string, string>();
        books.Add("Professional WPF Programming", "978-0-470-04180-2");
        books.Add("Professional ASP.NET MVC 5", "978-1-118-79475-3");
        books["Beginning Visual C# 2012"] = "978-1-118-31441-8";
        books["Professional C# 5 and .NET 4.5.1"] = "978-1-118-83303-2";

注意:SortedList<TKey, TValue>类只允许每个键有一个对应的值,如果需要每个键对应多个值,就可以使用Lookup<TKey, TElement>类。

可以使用foreach语句遍历该列表。枚举器返回的元素是KeyValuePair<TKey, TValue>类型,其中包含了键和值。键可以用Key属性访问,值可以用Value属性访问。

        foreach (KeyValuePair<string, string> book in books)
        {
          WriteLine($"{book.Key}, {book.Value}");
        }

迭代语句会按键的顺序显示书名和ISBN号:

        Beginning Visual C# 2012, 978-1-118-31441-8
        Professional ASP.NET MVC 5, 978-1-118-79475-3
        Professional C# 5 and .NET 4.5.1, 978-1-118-83303-2
        Professional WPF Programming, 978-0-470-04180-2

也可以使用Values和Keys属性访问值和键。因为Values属性返回IList<TValue>, Keys属性返回IList<TKey>,所以可以通过foreach语句使用这些属性:

        foreach (string isbn in books.Values)
        {
          WriteLine(isbn);
        }
        foreach (string title in books.Keys)
        {
          WriteLine(title);
        }

第一个循环显示值,第二个循环显示键:

        978-1-118-31441-8
        978-1-118-79475-3
        978-1-118-83303-2
        978-0-470-04180-2
        Beginning Visual C# 2012
        Professional ASP.NET MVC 5
        Professional C# 5 and .NET 4.5.1
        Professional WPF Programming

如果尝试使用索引器访问一个元素,但所传递的键不存在,就会抛出一个KeyNotFoundException类型的异常。为了避免这个异常,可以使用ContainsKey()方法,如果所传递的键存在于集合中,这个方法就返回true,也可以调用TryGetValue()方法,该方法尝试获得指定键的值。如果指定键对应的值不存在,该方法就不会抛出异常。

        string isbn;
        string title = "Professional C# 7.0";
        if (! books.TryGetValue(title , out isbn) )
        {
          WriteLine($"{title} not found");
        }