数组:
优点:索引速度非常快,而且赋值与修改元素也很简单,直接根据索引找到对象来进行操作即可!
缺点:在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。
int[] ii = new int[2];
ii[0] = 10;
ii[1] = 20;
ArrayList:
针对数组的缺点,C#中最先提供了ArrayList,(只有一个维度,多维可建立列表的列表)。
优点
1. 支持自动改变大小的功能,申明时不需要指定长度
2. 可以灵活的插入元素
3. 可以灵活的删除元素
4. 可以灵活访问元素
缺点
如果元素对象是值类型,引用时需要装拆箱,会造成很大的性能损失;元素是按照装箱状态存储和传递的,所以允许存储不同类型的数据,拆箱时类型不匹配会造成安全隐患。
ArrayList arrayList=new ArrayList();
arrayList.Add(123); //发生装箱操作
arrayList.Add(“123”);
arrayList[2] = 234; //修改数据
array.Insert(0, "abc"); //插入数据
array.RemoveAt(0); //删除数据
List
针对Array的缺点,C#引入了泛型List,申明时需要确定元素的类型
List<int> list=new list<int>(); //申请需要确定元素类型
list.Add(1); //未发生装箱操作
LinkedList
表示双重连接列表。
不能索引需要遍历,所以查询和修改效率低。不需要移动数据,只需要移动指针,所以添加和删除效率高。
属性:Count, First, Last
方法:AddAfter, AddBefore, Addfirst, AddLast, Clear, Contains, CopyTo, Find, FindLast, Remove, RemoveFirst, RemoveLast
项:LinkedListNode 属性:List, Next, Previous, Value
Queue
表示对象的先进先出集合。
相对于List,不能按任意索引增加或删除项;
增加项时,只能加在队尾:enqueue;
删除项时,只能将队首删除:dequeue;
属性:Count,
方法:Clear, Contains, CopyTo, Dequeue, Enqueue, Peek, ToArray, TrimExcess
var myQueue = new Queue<string>();
myQueue.Enqueue("first in line");//对象入栈,加入队列末尾
myQueue.Enqueue("second in line");
myQueue.Enqueue("third in line");
myQueue.Enqueue("last in line");
var mypeek = myQueue.Peek();//获取栈顶的对象,但是不删除改对象
var getFirst = myQueue.Dequeue();//获取栈顶的对象,然后删除队列中改对象
var getNext = myQueue.Dequeue();
var mycount = myQueue.Count;//获取栈中元素个数
myQueue.Clear();//清空栈中的对象
Stack
表示可变大小的后进先出 (LIFO) 集合(对于相同指定类型的实例)。
和Queue一样,不能按任意索引增加或删除项;
增加项时,只能加在队首:Push;
删除项时,只能将队首删除:Pop;
属性:Count,
方法:Clear, Contains, CopyTo, Peek, Pop, Push, ToArray, TrimExcess
var myStack = new Stack<string>();
myStack.Push("first in line");//对象入栈,压入栈顶
myStack.Push("second in line");
myStack.Push("third in line");
myStack.Push("last in line");
var mypeek = myStack.Peek();//获取栈顶的对象,但是不删除改对象
var getFirst = myStack.Pop();//获取栈顶的对象,然后删除队列中改对象
var getNext = myStack.Pop();
var mycount = myStack.Count;//获取栈中元素个数
myStack.Clear();//清空栈中的对象
Dictionary<TKey,TValue>
表示键和值的集合。Tkey:字典中的键的类型,TValue:字典中的值的类型。
Dictionary<string, string> picDic = new Dictionary<string, string>(); //创建一个字典
picDic.Add("jpg", "123.jpg"); //添加元素
picDic.Add("png", "123.png");
picDic.Add("bmp", "123.bmp");
picDic.Add("gif", "123.gif");
// 重复添加键名系统会报错
try
{
picDic.Add("jpg", "456.jpg");
}
catch (ArgumentException)
{
Console.WriteLine("An element with Key = \"jpg\" already exists.");
}
//修改值
Console.WriteLine("For key = \"jpg\", value = {0}.", picDic["jpg"]);
picDic["jpg"] = "456.jpg";
Console.WriteLine("For key = \"jpg\", value = {0}.", picDic["jpg"]);
// 修改值时,如果键名不存在,会自动添加新元素
picDic["gif"] = "123.gif";
Console.WriteLine("For key = \"gif\", value = {0}.", picDic["gif"]);
// 读取不存在的键名会报错
try
{
Console.WriteLine("For key = \"tif\", value = {0}.",
picDic["tif"]);
}
catch (KeyNotFoundException)
{
Console.WriteLine("Key = \"tif\" is not found.");
}
// 对于不确定是否存在的键名,使用以下方法
string value = "";
if (picDic.TryGetValue("tif", out value))
{
Console.WriteLine("For key = \"tif\", value = {0}.", value);
}
else
{
Console.WriteLine("Key = \"tif\" is not found.");
}
// 插入值之前,先查询键名是否存在
if (!picDic.ContainsKey("jpg"))
{
picDic.Add("jpg", "123.jpg");
Console.WriteLine("Value added for key = \"jpg\": {0}",
picDic["jpg"]);
}
// 使用枚举器遍历词典
foreach (KeyValuePair<string, string> kvp in picDic)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
//单独获取值的集合
Dictionary<string, string>.ValueCollection valueColl = picDic.Values;
Console.WriteLine();
foreach (string s in valueColl)
{
Console.WriteLine("Value = {0}", s);
}
//单独获取键的集合
Dictionary<string, string>.KeyCollection keyColl = picDic.Keys;
Console.WriteLine();
foreach (string s in keyColl)
{
Console.WriteLine("Key = {0}", s);
}
// 移除项.
picDic.Remove("doc");
if (!picDic.ContainsKey("doc"))
{
Console.WriteLine("Key \"doc\" is not found.");
}
Hashtable
表示根据键的哈希代码进行组织的键/值对的集合。
MSDN已不推荐将Hashtable类用于新的开发,建议使用泛型Dictionary类。
SortedList
表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
SortedList<string, string> strDic = new SortedList<string, string>();
strDic.Add("a","A");
strDic.Add("c", "C");
strDic.Add("e", "E");
strDic.Add("b", "B");
strDic.Add("d", "D");
foreach(KeyValuePair<string, string> kvp in strDic)
{
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}
/*
Key = a, Value = A
Key = b, Value = B
Key = c, Value = C
Key = d, Value = D
Key = e, Value = E
*/
HashSet
表示值的集,提供了高性能的设置操作。 集是不包含重复元素的集合,其元素无特定顺序。
HashSet<int> evenNumbers = new HashSet<int>();
HashSet<int> oddNumbers = new HashSet<int>();
for (int i = 0; i < 5; i++)
{
evenNumbers.Add(i * 2);
oddNumbers.Add((i * 2) + 1);
}
HashSet<int> numbers = new HashSet<int>(evenNumbers);
numbers.UnionWith(oddNumbers);
//numbers的集合包括{0,2,4,6,8,1,3,5,7,9}
numbers.Add(10); //会添加
numbers.Add(0); //不会添加,不报警
int[] a = new int[numbers.Count + 1];
numbers.CopyTo(a, 1);