SortedList的重要属性和方法:将元素添加到SortedList中:访问SortedList :访问key:从SortedList中删除元素:LINQ: 泛型">
猿教程 Logo

C# 泛型SortedList

泛型SortedList(SortedList <TKey,TValue>)表示基于IComparer<T>按键排序的键值对的集合。SortedList集合默认以键的升序存储键和值对。 泛型SortedList实现了IDictionary <TKey,TValue>和ICollection <KeyValuePair <TKey,TValue >>接口,因此元素可以通过键和索引访问。

C#包括两种类型的SortedList,泛型SortedList和非泛型SortedList。 泛型SortedList使用尖括号表示:SortedList <TKey,TValue>其中TKey是键的类型,TValue是值的类型。 非泛型类型不指定键和值的类型。

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


初始化通用SortedList:

您可以通过指定键和值的类型来初始化通用SortedList,如下所示。

相关实例:

SortedList<int,string> mySortedList = new SortedList<int,string>();

在上面的例子中,mySortedList将存储int类型的键和string类型的值(元素)。


SortedList的重要属性和方法:

属性描述
Capacity获取或设置SortedList <TKey,TValue>可以存储的元素数。
Count获取SortedList<TKey,TValue>中存在的元素总数。
IsReadOnly返回一个布尔值,表示SortedList <TKey,TValue>是否为只读。
Item 使用SortedList <TKey,TValue>中的指定键获取或设置元素。
Keys 获取SortedList<TKey,TValue>的键列表。
Values获取SortedList<TKey,TValue>中的值列表。
方法描述
void Add(TKey key, TValue value)将键值对添加到SortedList <TKey,TValue>。
void Remove(TKey key)删除具有指定键的元素。
void RemoveAt(int index)删除指定索引处的元素。
bool ContainsKey(TKey key)检查指定的键是否存在于SortedList <TKey,TValue>中。
bool ContainsValue(TValue value)检查指定的键是否存在于SortedList <TKey,TValue>中。
void Clear()从SortedList<TKey,TValue>中删除所有元素。
int IndexOfKey(TKey key)返回存储在SortedList<TKey,TValue>的内部数组中的指定键的索引。
int IndexOfValue(TValue value)返回存储在SortedList<TKey,TValue>的内部数组中的指定值的索引
bool TryGetValue(TKey key,out TValue value)返回true并使用指定的键分配值,如果键不存在,则返回false。

将元素添加到SortedList中:

使用Add()方法将键值对添加到SortedList中。 键不能为空,但值可以为null。 此外,key和value的数据类型必须与指定的相同,否则会产生编译时错误。

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

以下示例显示如何在泛型SortedList集合中添加键值对。

相关实例:

SortedList<int,string> sortedList1 = new SortedList<int,string>();
sortedList1.Add(3, "Three");
sortedList1.Add(4, "Four");
sortedList1.Add(1, "One");
sortedList1.Add(5, "Five");
sortedList1.Add(2, "Two");

SortedList<string,int> sortedList2 = new SortedList<string,int>();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);
// Compile time error: cannot convert from <null> to <int>
// sortedList2.Add("Five", null);
    
SortedList<double,int?> sortedList3 = new SortedList<double,int?>();
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集合会在每次添加元素时对元素进行排序。 所以如果你调试上面的例子,你将键入升序,即使他们是随机添加。 下图显示了调试视图中的SortedList。


如上图所示,sortedList1按键的升序存储键值对,而sortedList2按键的字母顺序存储项目,即使它们未按顺序添加。 sortedList3包括可空int,因此它包括null作为值。


访问SortedList <TKey,TValue>:

SortedList可以通过索引或键访问。 与其他集合类型不同,SortedList的Indexer需要key并返回该键的值。 但是,请确保该键存在于SortedList中,否则将抛出KeyNotFoundException。

相关实例:

SortedList<string,int> sortedList2 = new SortedList<string,int>();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);

Console.WriteLine(sortedList2["one"]);
Console.WriteLine(sortedList2["two"]);
Console.WriteLine(sortedList2["three"]);

//Following will throw runtime exception: KeyNotFoundException
Console.WriteLine(sortedList2["ten"]);

运行结果:

1 
2 
3

键和值索引器可以使用访问键和使用for循环的SortedList的值,如下所示:

相关实例:

SortedList<string,int> sortedList2 = new SortedList<string,int>();
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.Keys[i], sortedList2.Values[i]);
}

运行结果:

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

foreach:

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

相关实例:

SortedList<string,int> sortedList2 = new SortedList<string,int>();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);

foreach(KeyValuePair<string,int> kvp in sortedList2 )
        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

访问key:

如果不确定特定键是否存在或不是使用TryGetValue方法检索指定键的值。 如果key不存在,它将返回false,而不是抛出异常。

相关实例:

SortedList<string,int> sortedList2 = new SortedList<string,int>();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);

int val;

if (sortedList2.TryGetValue("ten",out val))
    Console.WriteLine("value: {0}", val);
else
    Console.WriteLine("Key is not valid.");

if (sortedList2.TryGetValue("one",out val))
    Console.WriteLine("value: {0}", val);

运行结果:

Key is not valid. 
value: 1

从SortedList中删除元素<TKey,TValue>:

使用Remove(key)和RemoveAt(index)方法从SortedList中删除值。

Remove()签名:bool Remove(TKey key)

RemoveAt()签名:void RemoveAt(int index)

相关实例:

SortedList<string,int> sortedList2 = new SortedList<string,int>();
sortedList2.Add("one", 1);
sortedList2.Add("two", 2);
sortedList2.Add("three", 3);
sortedList2.Add("four", 4);
    
sortedList2.Remove("one");//removes the element whose key is 'one'
sortedList2.RemoveAt(0);//removes the element at zero index i.e first element: four

foreach(KeyValuePair<string,int> kvp in sortedList2 )
        Console.WriteLine("key: {0}, value: {1}", kvp.Key , kvp.Value );

运行结果:

key: three, value: 3 
key: two, value: 2

Contains(),ContainsKey()和ContainsValue():

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

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

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

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

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

相关实例:

SortedList<string,int> sortedList = new SortedList<string,int>();
sortedList.Add("one", 1);
sortedList.Add("two", 2);
sortedList.Add("three", 3);
sortedList.Add("four", 4);
sortedList.Add("five", 5);
    
sortedList.Contains(2); // returns true
sortedList.Contains(4); // returns true
sortedList.Contains(6); // returns false

sortedList.ContainsKey(2); // returns true
sortedList.ContainsKey(6); // returns false

sortedList.ContainsValue("One"); // returns true
sortedList.ContainsValue("Ten"); // returns false

LINQ:

您可以使用LINQ查询语法或方法语法来使用不同的条件访问SortedList集合。

相关实例:

SortedList<string,int> sortedList = new SortedList<string,int>();
sortedList.Add("one", 1);
sortedList.Add("two", 2);
sortedList.Add("three", 3);
sortedList.Add("four", 4);
sortedList.Add("five", 5);

var result =  sortedList.Where(kvp => kvp.Key == "two").FirstOrDefault();
    
Console.WriteLine("key: {0}, value: {1}", result.Key, result.Value);

相关实例:

SortedList<string,int> sortedList = new SortedList<string,int>();
sortedList.Add("one", 1);
sortedList.Add("two", 2);
sortedList.Add("three", 3);
sortedList.Add("four", 4);
sortedList.Add("five", 5);

var query = from kvp in sortedList
            where kvp.Key == "two"
            select kvp;

var result = query.FirstOrDefault();

Console.WriteLine("key: {0}, value: {1}", result.Key, result.Value);

运行结果:

key: two, value: 2

进一步阅读:

要点
  1. C#有一个泛型和非泛型的SortedList。 

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

  3. 泛型SortedList存储指定数据类型的键和值。 所以不需要铸造。 

  4. 键值对可以转换为KeyValuePair <TKey,TValue>。 

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


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