C#集合 数组, ArayList,List,LinkedList, Queue, Stack,Dictionary,Hashtablle,SortedList,HashSet

数组:

优点:索引速度非常快,而且赋值与修改元素也很简单,直接根据索引找到对象来进行操作即可!

缺点:在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。

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);
发布了15 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yxt99/article/details/103970007