l 类SortedList所能完成的功能就相当于ArrayList与Hashtable的组合,SortedList元素可通过其键来访问,也可以通过其索引(索引从零开始)来访问,而且类SortedLis里面的元素是经过排序存放的。SortedList对象的元素将由键按照特定的比较方法实现,或按照键本身提供的比较方法实现进行排序。不论在哪种情况下,SortedList 都不允许重复键。
SortedList 对象在内部维护两个数组以存储列表的元素;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为DictionaryEntry对象进行访问的键/值对。键不能为 null,但值可以。
由于类SortedList的功能相当于ArrayList与Hashtable的组合,所以属性与方法也大多是这二者的组合。SortedList对象的容量是SortedList可以保存的元素数。随着向SortedList中添加元素,容量通过重新分配按需自动增加。可通过调用TrimToSize或通过显式设置Capacity属性减少容量。索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 SortedList,同时索引会相应地进行调整。当移除元素时,索引也会相应地进行调整。
类SortedList的排序的方法可以在构造函数中直接指定。例子SortedListSample演示了一个按照降序排列的区号与城市的有序列表。
首先提供比较方法的类MyCompare
namespace SortedListSample
{
public class MyCompare : IComparer
{
public int Compare(Object obj1,Object obj2)
{
return (Int32)obj2 -(Int32)obj1;
}
}
}
测试代码为:
namespace SortedListSample
{
class Program
{
static void Main(string[] args)
{
//生成一个SortedList对象,并传递实现了IComparer接口的类
SortedList sortedlist = new SortedList(new MyCompare());
sortedlist.Add(010, "北京");
sortedlist.Add(022, "天津");
sortedlist.Add(0451, "哈尔滨");
sortedlist.Add(0511, "镇江");
sortedlist.Add(0371, "郑州");
sortedlist.Add(0798, "景德镇");
//通过索引来遍历SortedList对象
for (int i = 0; i < sortedlist.Count; i++)
{
Console.WriteLine("区号0{0}-------城市名:{1}", sortedlist.GetKey(i), sortedlist.GetByIndex(i));
}
//由值得到索引
Console.WriteLine("{0}在列表中的索引是{1}", "哈尔滨", sortedlist.IndexOfValue("哈尔滨"));
//由键得到索引
Console.WriteLine("0{0}在列表中的索引是{1}", 0371, sortedlist.IndexOfKey(0371));
Console.WriteLine("表中{0}键是010的项。", sortedlist.ContainsKey(010) ? "有" : "没有");
Console.WriteLine("表中{0}键是0374的项。", sortedlist.ContainsKey(0374) ? "有" : "没有");
Console.WriteLine("表中{0}值是景德镇的项。", sortedlist.ContainsValue("景德镇") ? "有" : "没有");
Console.WriteLine("表中{0}值是襄樊的项。", sortedlist.ContainsValue("襄樊") ? "有" : "没有");
Console.ReadKey();
}
}
}
程序运行的结果是:
区号0798-------城市名:景德镇
区号0511-------城市名:镇江
区号0451-------城市名:哈尔滨
区号0371-------城市名:郑州
区号022-------城市名:天津
区号010-------城市名:北京
哈尔滨在列表中的索引是2
0371在列表中的索引是3
表中有键是010的项。
表中没有键是0374的项。
表中有值是景德镇的项。
表中没有值是襄樊的项。
l BitArray类是一个比特数组,数组的大小在生成对象的时候已经确定,每个数据元素只能表示一个比特,元素的值只能是1与0,其中用true表示1,用false表示0。当用其他数据类型的元素初始化该对象时,那么每个元素将占用该类型在内存中存储长度的数组空间。比如,int在内存中占用32位,那么一个整型数据就会占用BitArray类对象的32个空间。
BitArray类的对象中用属性Count表示该对象的空间的大小,用Length来表示该对象包含的元素的个数。
表10-8列出了类BitArray中一些特有的方法
表10-8
名称 | 功能说明 |
And | 对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“与”运算 |
Or | 对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“或”运算 |
Not | 反转当前BitArray中的所有位值 |
Xor | 对当前BitArray中的元素和指定的BitArray中的相应元素执行按位“异或”运算 |
Get | 获取BitArray中特定位置处的位的值 |
Set | 将BitArray中特定位置处的位设置为指定值 |
SetAll | 将BitArray中的所有位设置为指定值 |
例子BitArraySamples演示了类BitArray的一些使用方法。
using System;
using System.Collections; //注意命名空间
using System.Linq;
using System.Text;
namespace BitArraySamples
{
class Program
{
public static void Main()
{
// 建立和初始化若干个数组.
BitArray myBA1 = new BitArray(5);
BitArray myBA2 = new BitArray(5, false);
byte[] myBytes = new byte[2] { 2, 4};
BitArray myBA3 = new BitArray(myBytes);
bool[] myBools = new bool[5] { true, false, true, true, false };
BitArray myBA4 = new BitArray(myBools);
int[] myInts = new int[1] { 8 };
BitArray myBA5 = new BitArray(myInts);
// 显示数组的属性与数组中的内容.
Console.WriteLine("myBA1");
Console.WriteLine(" 数组大小: {0}", myBA1.Count);
Console.WriteLine(" 数组中元素的个数: {0}", myBA1.Length);
Console.WriteLine(" 数组中元素:");
PrintValues(myBA1, 8);
Console.WriteLine("myBA2");
Console.WriteLine(" 数组大小: {0}", myBA2.Count);
Console.WriteLine(" 数组中元素的个数: {0}", myBA2.Length);
Console.WriteLine(" 数组中元素:");
PrintValues(myBA2, 8);
Console.WriteLine("myBA3");
Console.WriteLine(" 数组大小: {0}", myBA3.Count);
Console.WriteLine(" 数组中元素的个数: {0}", myBA3.Length);
Console.WriteLine(" 数组中元素:");
PrintValues(myBA3, 8);
Console.WriteLine("myBA4");
Console.WriteLine(" 数组大小: {0}", myBA4.Count);
Console.WriteLine(" 数组中元素的个数: {0}", myBA4.Length);
Console.WriteLine(" 数组中元素:");
PrintValues(myBA4, 8);
Console.WriteLine("myBA5");
Console.WriteLine(" 数组大小: {0}", myBA5.Count);
Console.WriteLine(" 数组中元素的个数: {0}", myBA5.Length);
Console.WriteLine(" 数组中元素:");
PrintValues(myBA5, 8);
Console.ReadKey();
}
public static void PrintValues(IEnumerable myList, int myWidth)
{
int i = myWidth;
foreach (Object obj in myList)
{
if (i <= 0)
{
i = myWidth;
Console.WriteLine();
}
i--;
Console.Write("{0,8}", obj);
}
Console.WriteLine();
}
}
}
程序的运行结果是
myBA1
数组大小: 5
数组中元素的个数: 5
数组中元素:
False False False False False
myBA2
数组大小: 5
数组中元素的个数: 5
数组中元素:
False False False False False
myBA3
数组大小: 16
数组中元素的个数: 16
数组中元素:
False True False False False False False False
False False True False False False False False
myBA4
数组大小: 5
数组中元素的个数: 5
数组中元素:
True False True True False
myBA5
数组大小: 32
数组中元素的个数: 32
数组中元素:
False False False True False False False False
False False False False False False False False
False False False False False False False False
False False False False False False False False