猿教程 Logo

C# SortedList

默认情况下,SortedList集合按键的升序存储键值对。 SortedList类实现了IDictionary和ICollection接口,因此可以通过键和索引访问元素。

C#包括两种类型的SortedList,通用SortedList和非泛型SortedList。 在这里,我们将了解非泛型SortedList。


SortedList的主要属性和方法

属性
描述
Capacity获取或设置SortedList实例可以存储的元素数。
Count获取SortedList中实际包含的元素数。
IsFixedSize获取一个值,指示SortedList是否具有固定大小。
IsReadOnly获取一个值,指示SortedList是否为只读。
Item获取或设置SortedList中指定键的元素。
Keys获取SortedList的键列表。
Values获取SortedList中的值列表。
方法描述
void Add(object key,object value)将键值对添加到SortedList中。
void Remove(object key)使用指定的键删除元素。
void RemoveAt(int index)删除指定索引处的元素。
bool Contains(object key)检查SortedList中是否存在指定的键。
void Clear()从SortedList中删除所有元素。
object GetByIndex(int index)通过存储在内部数组中的索引返回值
object GetKey(int index)返回存储在内部数组中指定索引处的键
int IndexOfKey(object key)返回存储在内部数组中的指定键的索引
int IndexOfValue(object value)返回存储在内部数组中的指定值的索引

SortedList添加元素

使用Add()方法将键值对添加到SortedList中。

Add()方法签名:void Add(object key,object value)

键不能为空,但值可以为null。 此外,所有键的数据类型必须相同,以便它可以进行比较否则会抛出运行时异常。

SortedList新增元素案例:

SortedList sortedList1 = new SortedList();
sortedList1.Add(3, "Three");
sortedList1.Add(4, "Four");
sortedList1.Add(1, "One");
sortedList1.Add(5, "Five");
sortedList1.Add(2, "Two");
SortedList sortedList2 = new SortedList();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);
SortedList sortedList3 = new SortedList();
sortedList3.Add(1.5, 100);
sortedList3.Add(3.5, 200);
sortedList3.Add(2.4, 300);
sortedList3.Add(2.3, null);
sortedList3.Add(1.1, null);

重点:在内部,SortedList维护着两个object []数组,一个用于键,另一个用于值。 因此,当您添加键值对时,它使用键运行二分搜索,以找到相应的索引,以在相应的数组中存储键和值。 当您从中删除元素时,它会重新排列元素。

SortedList集合会在每次添加元素时对元素进行排序。 所以如果你调试上面的例子,你会发现键的升序,即使他们是随机添加,如下:


请注意,sortedList2在上面的图像中按字母顺序对字符串键排序键。

SortedList键可以是任何数据类型,但不能在同一SortedList中添加不同数据类型的键。 以下示例将抛出运行时异常,因为我们尝试使用字符串键添加第二个项目:

SortedList sortedList = new SortedList();
sortedList.Add(3, "Three");
sortedList.Add("Four", "Four"); // Throw exception: InvalidOperationException
sortedList.Add(1, "One");
sortedList.Add(8, "Five");
sortedList.Add(2, "Two");

访问SortedList

SortedList可以通过索引或键访问。 与其他集合不同,SortedList需要key而不是index来访问该键的值。

SortedList sortedList = new SortedList();
sortedList.Add("one", 1);
sortedList.Add("two", 2);
sortedList.Add("three", 3);
sortedList.Add("four", "Four");
int i = (int) sortedList["one"];
int j = (int) sortedList["two"];
string str = (string) sortedList["four"];
Console.WriteLine(i);
Console.WriteLine(j);
Console.WriteLine(str);

运行结果:

1
2
Four

非泛型SortedList集合可以包含任何数据类型的键和值。 因此,值必须转换为适当的数据类型,否则会给出编译时错误。

SortedList sortedList2 = new SortedList();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);
for (int i = 0; i < sortedList2.Count; i++)
{
Console.WriteLine("key: {0}, value: {1}",
sortedList2.GetKey(i), sortedList2.GetByIndex(i));
}

运行结果:

key: four, value: 4
key: one, value: 1
key: three, value: 3
key: two, value: 2

使用foreach循环访问SortedList

在C#中的foreach语句可以用于访问SortedList集合。 SortedList元素包括键和值。 因此,元素的类型将是DictionaryEntry,而不是键或值的类型。

SortedList sortedList1 = new SortedList();
sortedList1.Add("one", 1);
sortedList1.Add("two", 2);
sortedList1.Add("three", 3);
sortedList1.Add("four", 4);
foreach(DictionaryEntry kvp in sortedList1 )
    Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value );

运行结果:

key: four, value: 4
key: one, value: 1
key: three, value: 3
key: two, value: 2

从SortedList删除元素

使用Remove()或RemoveAt()方法从SortedList中删除元素。

Remove()签名:void Remove(object key)

RemoveAt()signature:void RemoveAt(int index)

SortedList sortedList1 = new SortedList();
sortedList1.Add("one", 1);
sortedList1.Add("two", 2);
sortedList1.Add("three", 3);
sortedList1.Add("four", 4);
sortedList1.Remove("one");//removes element whose key is 'one'
sortedList1.RemoveAt(0);//removes element at zero index i.e first element: four
foreach(DictionaryEntry kvp in sortedList1 )
Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value );

运行结果:

key: three, value: 3
key: two, value: 2
Check for existing k

检查SortedList中是否存在

Contains()和ContainsKey()方法确定指定的键是否存在于SortedList集合中。

Contains()签名:bool Contains(object key)

ContainsKey()签名:bool ContainsKey(object key)

ContainsValue()方法确定在SortedList中是否存在指定的值。

ContainValue()签名:bool ContainValue(object value)

SortedList sortedList = new SortedList();
sortedList.Add(3, "Three");
sortedList.Add(2, "Two");
sortedList.Add(4, "Four");
sortedList.Add(1, "One");
sortedList.Add(8, "Five");
sortedList.Contains(2); // 返回true
sortedList.Contains(4); // 返回true
sortedList.Contains(6); // 返回false
sortedList.ContainsKey(2); // 返回true
sortedList.ContainsKey(6); // 返回 false
sortedList.ContainsValue("One"); // 返回 true
sortedList.ContainsValue("Ten"); // 返回false
要点
  1. C#有通用和非通用的SortedList。

  2. SortedList按键的升序存储键/值对。 键必须是唯一的,且不能为空,而值可以为空或重复。

  3. 非通用SortedList存储任何数据类型的键和值。 因此,值需要转换为适当的数据类型。

  4. 键值对可以转换为DictionaryEntry。

  5. 使用索引器访问单个值。 SortedList索引器接受键以返回与其相关联的值。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/Csharp-sortedlist.html