using System;
using System.Collections;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//C#集合(Collection)
/*
* 集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对 栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。
* 集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建Object类的对象的合集。在C#中,Object类是所有数据类型的基类。
* 下面是各种常用的System.Collection命名空间的类。
*/
//列表List
var list = new List<int>();
//List通过索引分配,索引和数组一样从0开始。
list.Add(15);
list.Add(17);
list.Add(15);
list.Add(2);
list.Add(-90);
Console.WriteLine($"第一个数为:{list[0]}");//15
//列表可以有相同的项,而且项是手动排序,在改变项后,要注意项的索引会发生改变:
list.Remove(15);//删除第一个匹配此条件的项
Console.WriteLine($"第一个数为:{list[0]}");//17
Console.WriteLine($"第二个数为:{list[1]}");//15
/*
* 常用的列表方法:
* 1.Add()将东西加入到列表的最后。
* 2.Remove()删掉项中第一个匹配你想删除的条件的项(删去第一个匹配此条件的项)。
* 3.Clear()清空所有项。
* 4.Sort()用系统默认的方式对项进行排序。
* 5.Contains()查看某项是否存在于列表中。
*/
list.Sort();//由小到大排序
foreach(var item in list)
{
Console.WriteLine(item);
}
bool b1 = list.Contains(2);
Console.WriteLine(b1);
//字典Directory
var directory = new Dictionary<string, int>();
directory.Add("a", 1);
directory.Add("b", 2);
directory.Add("c", 3);
//键必须是唯一的且不能是空引用
Console.WriteLine(directory["a"]);
/*
* 常用方法
* 1.Add()添加键和值
* 2.Clean()清空字典中所有键和值
* 3.Count()获取字典中有多少对键和值
* 4.Remove()删掉一个键和值
* 5-6.ContaionsKey()/ContainsValue()查看是否包含指定的键/值
*/
Console.WriteLine($"删除前的Count: {directory.Count}");
directory.Remove("b");
Console.WriteLine(directory["a"]);
Console.WriteLine($"删除后的Count: {directory.Count}");
Console.WriteLine(directory.ContainsKey("c"));
//字典、堆栈、队列不能排序,想要对字典排序就要使用其他方法,如SortedDictionary<TKey, TValue>。
//动态数组ArrayList
/*
* 动态数组代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,你可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它允许在列表中进行动态内存分配、增加、搜索、排序各项。
* 常用属性
* Capacity获取或设置ArrayList可以包含的元素个数
* Count获取ArrayList中实际包含的元素个数
* IsFixedSize获取一个值,表示ArrayList是否具有固定大小
* IsReadOnly获取一个值,表示ArrayList是否只读
* IsSynchronized获取一个值,表示访问ArrayList是否同步(线程安全)。
* Item[Int32]获取或设置指定索引处的元素
* SyncRoot获取一个对象用于同步访问ArrayList
*
* 常用方法
* public virtual int Add(object value);在ArrayList的末尾添加一个对象
* public virtual void AddRange(ICollection c);在ArrayList的末尾添加ICollection元素。
* public virtual void Clear();从ArrayList中移除所有元素
* public virtual bool Contains(object item);判断某个元素是否在ArrayList中
* public virtual ArrayList GetRange(int index, int count)返回一个ArrayList,表示源ArrayList中元素的子集。
* public virtual int IndexOf(object);返回某个值在ArrayList中第一次出现的索引,索引从零开始。
* public virtual void Insert(int index, object value);在ArrayList的指定索引处,插入一个元素
* public virtual void InsertRange(int index, ICollection c);在ArrayList的指定索引处,插入某个集合的元素。
* public virtual void Remove(object obj);从ArrayList中移除第一次出现的指定对象
* public virtual void RemoveAt(int index);移除ArrayList中指定索引处的元素
* public virtual void RemoveRange(int index, int count);从ArrayList中移除某个范围的元素
* public virtual void Reverse();逆转元素顺序
* public virtual void SetRange(int index, ICollection c);复制某个集合的元素到ArrayList中某个范围的元素上
* public virtual void Sort();对元素进行排序
* public virtual void TrimToSize();设置容量为ArrayList中元素的实际个数
*/
ArrayList arrayList = new ArrayList();
arrayList.Add(45);
arrayList.Add(78);
arrayList.Add(33);
arrayList.Add(56);
arrayList.Add(12);
arrayList.Add(23);
arrayList.Add(9);
Console.WriteLine("Capacity: {0}", arrayList.Capacity);
Console.WriteLine("Count: {0}", arrayList.Count);
Console.Write("Content: ");
foreach(int i in arrayList)
{
Console.Write(i + " ");
}
Console.WriteLine();
Console.Write("Sorted Content: ");
arrayList.Sort();
foreach (int i in arrayList)
{
Console.Write(i + " ");
}
Console.WriteLine();
//ArrayList存储不同类型时的排序
ArrayList arrayList2 = new ArrayList();
arrayList2.Add(77);
arrayList2.Add(22);
arrayList2.Add("c");
arrayList2.Add("a");
arrayList2.Add(99);
foreach (object i in arrayList2)
{
Console.Write(i + " ");
}
Console.WriteLine();
//77 22 c a 99
arrayList2.Sort(new MyArrayListComparer());
foreach (object i in arrayList2)
{
Console.Write(i + " ");
}
Console.WriteLine();
//22 77 c a 99
//哈希表(Hashtable)
/*
* 常用属性
* Count获取Hashtable中包含的键值对个数
* IsFixedSize获取一个值,表示Hashtable是否具有固定大小
* IsReadOnly获取一个值,表示Hashtable是否只读
* Item获取或设置与指定的键相关的值
* Keys获取一个ICollection,包含Hashtable中的键
* Values获取一个ICollection,包含Hashtable中的值
*
* 常用方法
* public virtual void Add(object key, object value);向Hashtable添加一个带有指定的键和值的元素
* public virtual void Clear()从Hashtable中移除所有的元素
* public virtual bool ContainsKey(object key);判断Hashtable是否包含指定的键
* public virtual bool ContainsValue(object value);判断Hashtable是否包含指定的值
* public virtual void Remove(object key);从Hashtable中移除带有指定的键的元素
*
*/
Hashtable hashtable = new Hashtable();
hashtable.Add("001", "Zara Ali");
hashtable.Add("002", "Abida Rehman");
hashtable.Add("003", "Joe Holzner");
hashtable.Add("004", "Mausam Benazir Nur");
hashtable.Add("005", "M.Amlan");
hashtable.Add("006", "M.Arif");
hashtable.Add("007", "Ritesh Saikia");
if(hashtable.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}else
{
hashtable.Add("008", "Nuha Ali");
}
//获取键的集合
ICollection key = hashtable.Keys;
foreach(string k in key)
{
Console.WriteLine(k+":"+hashtable[k]);
}
//这里是哈希表,乱序
//排序列表(SortedList)
/*
* SortedList类代表了一系列按照键来排序的键值对,这些键值对可以通过键和索引来访问。
* 排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果使用索引访问各项,则它是一个动态数组(ArrayList);如果使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序的。
*
* 常用属性
* Capacity获取或设置SortedList的容量
* Count获取SortedList中的元素个数
* IsFixedSize获取一个值,表示SortedList是否具有固定大小
* IsReadOnly获取一个值,表示SortedList是否只读
* Item获取或设置与SortedList中只读的键相关的值
* Keys获取SortedList中的键
* Values获取SortedList中的值
* 常用方法
* public virtual void Add(object key, object value)向SortedList添加一个带有指定的键和值的元素
* public virtual void Clear()从SortedList中移除所有的元素
* public virtual bool ContainsKey(object key)判断SortedList是否包含指定的键
* public virtual bool ContainsValue(object value)判断SortedList是否包含指定的值
* public virtual object GetByIndex(int index);获取SortedList的指定索引处的值
* public virtual object GetKey(int index);获取SortedList的指定索引处的键
* public virtual IList GetKeyList();获取SortedList中的键
* public virtual IList GetValueList();获取SortedList中的值
* public virtual int IndexOfKey(object key);返回SortedList中的指定键的索引,索引从0开始
* public virtual int IndexOfValue(object value);返回SortedList中指定值第一次出现的索引,索引从零开始
* public virtual void Remove(object key);从SortedList中移除带有指定的键的元素
* public virtual void RemoveAt(int index);移除SortedList的指定索引处的元素
* public virtual void TrimToSize();设置容量为SortedList中元素的实际个数
*/
SortedList sortedList = new SortedList();
sortedList.Add("001", "Zara Ali");
sortedList.Add("002", "Abida Rehman");
sortedList.Add("003", "Joe Holzner");
sortedList.Add("004", "Mausam Benazir Nur");
sortedList.Add("005", "M.Amlan");
sortedList.Add("006", "M.Arif");
sortedList.Add("007", "Ritesh Saikia");
if (sortedList.ContainsValue("Nuha Ali"))
{
Console.WriteLine("This student name is already in the list");
}
else
{
sortedList.Add("008", "Nuha Ali");
}
//获取键的集合
ICollection key2 = sortedList.Keys;
foreach (string k in key2)
{
Console.WriteLine(k + ":" + sortedList[k]);
}
//这里按Add顺序显示
//堆栈(Stack)
/*
* 代表了一个后进先出的对象集合。当你需要对各项进行后进先出的访问时,则使用堆栈。向列表中添加一项称为推入元素,向列表中移除一项称为弹出元素。
*
* 常用属性
* Count获取Stack中包含的元素个数
* 常用方法
* public virtual void Clear()从Stack中移除所有的元素
* public virtual bool Contains(object obj);判断某个元素是否在Stack中。
* public virtual object Peek();返回在Stack的顶部的对象,但不移除它
* public virtual object Pop()移除并返回在Stack的顶部对象
* public virtual void Push(object obj);向Stack的顶部添加一个对象
* public virtual object[] ToArray();复制Stack到一个新的数组中
*/
Stack stack = new Stack();
stack.Push('A');
stack.Push('M');
stack.Push('G');
stack.Push('W');
Console.WriteLine("Current stack: ");
foreach(char c in stack)
{
Console.Write(c + " ");
}
Console.WriteLine();
stack.Push('V');
stack.Push('H');
Console.WriteLine("The next poppable value in stack: {0}",stack.Peek());
Console.WriteLine("Current stack: ");
foreach (char c in stack)
{
Console.Write(c + " ");
}
Console.WriteLine();
Console.WriteLine("Removing values");
stack.Pop();
stack.Pop();
stack.Pop();
Console.WriteLine("Current stack: ");
foreach (char c in stack)
{
Console.Write(c + " ");
}
Console.WriteLine();
//队列(Queue)
/*
* 代表了一个先进先出的对象合集。当需要对各项进行先进先出的访问时,则使用队列。在列表中添加一项称为入队,在列表中移除一项称为出队
*
* 常用属性
* Count获取Queue中包含的元素个数
* 常用方法
* public virtual void Clear()从Queue中移除所有的元素
* public virtual bool Contains(object obj)判断某个元素是否在Queue中
* public virtual object Dequeue();移除并返回在Queue的开头的对象
* public virtual void Enqueue(object obj);向Queue的末尾添加一个对象
* public virtual object[] ToArray();复制Queue到一个新的数组中
* public virtual void TrimToSize()设置容量为Queue中元素的实际个数
*/
Queue queue = new Queue();
queue.Enqueue('A');
queue.Enqueue('M');
queue.Enqueue('G');
queue.Enqueue('W');
Console.WriteLine("Current queue: ");
foreach (char c in queue)
Console.Write(c + " ");
Console.WriteLine();
queue.Enqueue('V');
queue.Enqueue('H');
Console.WriteLine("Current queue: ");
foreach (char c in queue)
Console.Write(c + " ");
Console.WriteLine();
Console.WriteLine("Removing some values");
char ch = (char)queue.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
ch = (char)queue.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
Console.WriteLine("Current queue: ");
foreach (char c in queue)
Console.Write(c + " ");
Console.WriteLine();
//点阵列(BitArray)
/*
* 管理一个紧凑型的位值数组,它使用布尔值来表示,其中true表示位是开启的(1),false表示位是关闭的(0);
* 当需要存储位,但事先不知道位数时,则使用点阵列。你可以使用整型索引从点整列集合中访问各项,索引从零开始。
*
* 常用属性
* Count获取BitArray中包含的元素个数
* IsReadOnly获取一个值,表示BitArray是否只读
* Item获取或设置BitArray中指定位置的位的值
* Length获取或设置BitArray中的元素个数
*
* 常用方法
* public BitArray And(BitArray value);对当前的BitArray中的元素和指定的BitArray中的相对应的元素执行按位与操作
* public bool Get(int index);获取BitArray中指定位置的位的值
* public BitArray Not();把当前的BitArray中的位值反转
* public BitArray Or(BitArray value);对当前的BitArray中的元素和指定的BitArray中的相对应的元素执行按位或操作
* public void Set(int index, bool value)把BieArray中指定位置的位设置为指定的值
* public void SetAll(bool value);把BitArray中的所有位设置为指定的值
* public BitArray Xor(BitArray value);对当前的BitArray中的元素和指定的BitArray中相对应的元素执行按位异或操作
*/
//创建2个大小为8的点阵列
BitArray ba1 = new BitArray(8);
BitArray ba2 = new BitArray(8);
byte[] a = { 60 };
byte[] b = { 13};
//把值60和13存储到点阵列中
ba1 = new BitArray(a);
ba2 = new BitArray(b);
//ba1的内容
Console.WriteLine("Bit Array ba1: 60");
for(int i = 0; i < ba1.Count; i++)
{
Console.Write("{0,-6}", ba1[i]);
}
Console.WriteLine();
//ba2的内容
Console.WriteLine("Bit Array ba2: 13");
for (int i = 0; i < ba2.Count; i++)
{
Console.Write("{0,-6}", ba2[i]);
}
Console.WriteLine();
BitArray ba3 = new BitArray(8);
ba3 = ba1.And(ba2);
//ba3的内容
Console.WriteLine("Bit Array ba3: ba1 & ba2");
for (int i = 0; i < ba3.Count; i++)
{
Console.Write("{0,-6}", ba3[i]);
}
Console.WriteLine();
Console.ReadKey();
}
}
class MyArrayListComparer : IComparer
{
public int Compare(object x, object y)
{
//自定义比较规则
//如果x,y都是int,那么按照正常流程比较
//如果其中一个不是int,那么认为不是int的值小
//如果都不是int,那么认为他们相等
if(x is int)
{
if(y is int)
{
if ((int)x < (int)y) return -1;
if ((int)x == (int)y) return 0;
return 1;
}
return 1;
}
if (y is int) return 1;
return 0;
}
}
}