于梦想齐行
于梦想齐行

C#集合(Collection)

C#集合(Collection)
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;
        }
    }
}
#
首页      CSharp      C#集合(Collection)

于梦想齐行

C#集合(Collection)
using System; using System.Collections; using System.Collections.Generic; namespace ConsoleApp1 { class Program { static void Main(string[] args)…
扫描二维码继续阅读
2022-06-30
近期文章
近期评论