C# 集合类 :(Array、 Arraylist、List、Hashtable、Dictionary、Stack、Queue)

到了年终节前,据他们说骗子们也要冲业绩过个好年,所以活动也往往了。而随着骗子们的狂妄,上当受骗的人不可防止也就多了。而新近这两年对坐飞机的旅人来讲,所遇到最多的应有就是航班退改签短信诈骗行为了,随着愈多的人接踵而至 蜂拥而至掉入这精准投放的陷阱,在许多的防骗攻略前面,不禁想问受骗的您:你为啥会受骗?

我们用的相比多的非泛型集合类首要有 ArrayList类 和
HashTable类。大家平常用HashTable
来储存将要写入到数据库只怕重回的音信,在那里面要时时刻刻的开始展览项目标转速,扩充了系统装箱和拆箱的负担,14:31:45,例如大家需求在电子商务网站中存款和储蓄用户的购物车消息(商品名,对应的货物个数)时,完全能够用
Dictionary<string, int> 来存款和储蓄购物车消息,而不须求任何的品类转化。

干什么?相信你会不明,因为就连你本人都不甘于相信,本人的确正是那么好骗吗?但实际情形摆在前面,你实在是被骗了。

 

说实话,看到你那么失落,确实有些不忍心再打击你。固然骗子的骗术有所进步,用违规得到的你的私有买票出游新闻让您相信,可是,骗子除了采取专骗那一个买票的行人外,骗术依然老套路,但是在群发短信内容上多加了一个个人信息插件外,剩下的都不要紧新东西。而受骗受骗的人和你同一都未曾什么样明显的天性特征,男女老少贫富美丑高矮胖瘦高级知识分子文盲白领民工都以轻易分布的,被骗上当的历程依旧也都以各有千秋。那丰富表达,除了骗子熟谙的行骗技巧外,你协调也要自省,自个儿随身肯定有个别什么共性的东西被骗子抓住了,利用了。

1.数组是原则性大小的,不能够伸缩。即使System.Array.Resize这一个泛型方法可以重置数组大小, 

故此,来和您研讨一下那么些可能让你为难的话题,怎样?

 

北齐张应俞曾写过一部《骗经》,总计了二十各个诈骗行为格局,有空你也得以参考一下,当教科书当小说看都行。但是万变不离其宗,骗术不相同于其余的犯案手段,在于它的骗字,让您愿意自行交出财物的全体权,那是内需肯定的智慧相协作的,一般人还玩不转。在退改签机票短信诈骗行为中,骗子的招数也就那么三板斧:首先创造八个危害事件(如航班裁撤),你收到那几个消息后,必然会副肾素分泌程度增加,心跳加速、血压回涨,出现一种任何人都会师世的“应激状态”。在此情景下,你早晚觉得不到温馨定夺水平和决定品质下滑,急于使用“行动”解除那种景观,出现注意力狭窄是一定的。利用那种注意力的狭隘,骗子从精神上决定了和睦还没察觉到被操纵的你,然后使用你的个人新闻插件,成功地在你和骗子之间建立起一个短暂的能够导致信任的音讯链,然后再冒充专物业全体权威的位置(机票销售商、航空集团、飞机场等)彻底转移你对本身金钱的注意力,牵着你的鼻子让你协调把钱交到骗子手里。

唯独该措施是再次创立新装置大小的数组,用的是旧数组的成分开端化。随后以前的数组就丢弃!而集合却是可变长的 

您作为受害者所具备的能够使和谐陷入被害情境的那种心境或生理、内在或外在的趋力、趋向或大概,让骗子闻着味儿找到了您。不难点讲,是因为你富有了被骗的思想前提,然后恰逢其会,正幸好错误的小运遇见了处心积虑的垂钓短信,让祥和错误地改成了钩上的鱼。仔细回顾整个上当受骗进度,你会气馁地觉察,其实在那几个进程中您有这几个的空子冷不丁醒悟,秒破骗局。那也再也应验骗子的骗术并不是天衣无缝,至少在更换你的资财全部权进程中的常识性的不创设——比如在ATM机上执行电子商务验证账户操作之类——应该被察觉的,哪个人听别人讲过ATM机能当做电子商务客户端来利用啊?至少在当前,在现行反革命的地球,还从未耳闻过。

 

也许你的末梢七个迷惑便是,既然骗子的骗术这么漏洞百出,这干什么还会有那么多少人上当?那几个题材其实很不难,能够用费用和受益的涉及来试着表明。对于骗子来说,目标就是在开阔人海中找到3个受骗者,把钱骗到手。而对您来讲,保持自然警惕性能够预防上当受骗。骗子供给立即获得你的个人新闻,有针对地发送十分数量的短信来抛钩,那个都以须要费用的。而骗子只要把精力首要位于了抛钩前骗术的升级上(抛钩后转移财富的骗术并从未多大变迁),等于是增高了资本,纵然可能钩到更加多的鱼,可是骗子跟钩上来的鱼一对一联络起来,开销持续回升,甚至还有把“放蛇”的巡捕引进来那种高风险基金。最后这一个不傻也不天真的人会在深远的沟通之后察觉真相,拒绝交钱给诈骗行为者,那骗子就是白忙了。于是真相来了,骗子或许是明知故犯发送那几个看上去并不怎么高明的短信给你和其余目的旅客,直接筛选出那多少个“真傻”的鱼,就算钩到的鱼少了,但是把钱骗到手的成功率升高了,意即升高了单位生产率和投入产出比,那也印证骗子们其实依旧很有购销头脑的。

2.数组要评释成分的门类,集合类的成分类型却是object. 

好了,你也不用太沮丧,骗子再拿走多少赞扬,他要么1个应该被追究法律权利的作案犯罪困惑人,根本不能够和作为权威的行人的你不分相互。相信你看完那篇短文后,不再为友好的忽视而自责,不会再被接近的圈套所迷惑。你应该感到喜笑颜开的是,骗子们将会为永久失去2个重中之重的靶子客户而痛心疾首。

 

打赏地址
http://weibo.com/p/1001603809090173307983?from=page\_100505\_profile&wvr=6&mod=wenzhangmod
谢谢您了

3.数组可读可写不能够声称只读数组。集合类可以提供ReadOnly方法以只读方式选用集合。 

 

4.数组要有整数下标才能访问特定的因素,然则无数时候那样的下标并不是很有用。集合也是数量列表却不使用下标访问。 

 

洋洋时候集合有定制的下标类型,对于队列和栈根本就不协理下标访问! 

 

 

 

1.数组 

 

int[] intArray1; 

 

//初步化已扬言的一维数组 

 

intArray1 = new int[3]; 

 

intArray1 = new int[3]{1,2,3}; 

 

intArray1 = new int[]{1,2,3}; 

 

 

 

2.ArrayList类指标被设计改为二个动态数组类型,其体量会随着要求而方便的扩张 

 

方法 

 

1:Add()向数组中添加二个因素, 

 

2:Remove()删除数组中的五个要素 

 

3:RemoveAt(int i)删除数组中索引值为i的要素 

 

4:Reverse()反转数组的因素 

 

5:Sort()以从小到大的顺序排列数组的因素 

 

6:Clone()复制一个数组 

 

using System;

 

 using System.Collections.Generic;

 

 using System.Text;

 

 using System.Collections;

 

 namespace ConsoleApplication1

 

 {

 

     class Program

 

      {

 

         static void Main(string[] args)

 

          {

 

             ArrayList al = new ArrayList();

 

             al.Add(100);//单个添加

 

              foreach (int number in new int[6] { 9, 3, 7, 2, 4, 8 })

 

              {

 

                 al.Add(number);//集体添加方法一//清清月儿 

 

             }

 

              int[] number2 = new int[2] { 11,12 };

 

             al.AddRange(number2);//集体添加方法二

 

             al.Remove(3);//移除值为3的

 

             al.RemoveAt(3);//移除第3个

 

             ArrayList al2 = new ArrayList(al.GetRange(1,
3));//新ArrayList只取旧ArrayList一部份

 

 

             Console.WriteLine(“遍历方法一:”);

 

             foreach (int i in al)//不要强制转换

 

              {

 

                 Console.WriteLine(i);//遍历方法一

 

             }

 

 

 

             Console.WriteLine(“遍历方法二:”);

 

             for (int i = 0; i != al2.Count; i++)//数组是length

 

              {

 

                 int number = (int)al2[i];//一定要强制转换

 

                 Console.WriteLine(number);//遍历方法二

 

             }

 

         }

 

     }

 

 }

 

 

 

3.List 

 

可透过索引访问的靶子的强类型列表。提供用于对列表举行搜索、排序和操作的措施,在决定利用
List 依然选拔 ArrayList 类(两者兼有类似的职能)时,记住 List
类在多数情况下实施得更好还若是连串安全的。假使对 List 类的类型 T
使用引用类型,则八个类的作为是完全相同的。但是,假若对项目 T
使用值类型,则须求考虑达成和装箱难题。 

 

一旦对品种 T 使用值类型,则编写翻译器将越发针对该值类型生成 List
类的落到实处。这代表不必对 List
对象的列表成分实行李装运箱就能够运用该因素,并且在创建差不多 500
个列表元素之后,不对列表成分装箱所节省的内部存款和储蓄器将过量生成该类实现所运用的内部存款和储蓄器。 

 

//声惠氏(WYETH)个List对象,只参加string参数 

 

List<string> names = new List<string>(); 

 

names.Add(“乔峰”); 

 

names.Add(“欧阳峰”); 

 

names.Add(“马蜂”); 

 

//遍历List 

 

foreach (string name in names) 

 

 

Console.WriteLine(name); 

 

 

//向List中插入成分 

 

names.Insert(2, “张三峰”); 

 

//移除钦赐元素 

 

names.Remove(“马蜂”); 

 

 

 

4.Dictionary 

 

意味着键和值的会晤。Dictionary遍历输出的相继,正是参与的相继,这一点与Hashtable不相同 

 

Dictionary<string, string> myDic = new Dictionary<string,
string>();

 

     myDic.Add(“aaa”, “111”);

 

     myDic.Add(“bbb”, “222”);

 

     myDic.Add(“ccc”, “333”);

 

     myDic.Add(“ddd”, “444”);

 

     //借使添加已经存在的键,add方法会抛出格外

 

     try

 

       {

 

         myDic.Add(“ddd”,”ddd”);

 

     }

 

     catch (ArgumentException ex)

 

       {

 

         Console.WriteLine(“此键已经存在:” + ex.Message);

 

     }

 

     //化解add()很是的点子是用ContainsKey()方法来判断键是否留存

 

     if (!myDic.ContainsKey(“ddd”))

 

       {

 

         myDic.Add(“ddd”, “ddd”);

 

     }

 

     else

 

       {

 

         Console.WriteLine(“此键已经存在:”);

 

     }

 

 

    
//而使用索引器来负值时,假使建已经存在,就会修改已有的键的键值,而不会抛出相当

 

     myDic [“ddd”]=”ddd”;

 

     myDic[“eee”] = “555”;

 

     

     //使用索引器来取值时,如果键不设有就会吸引那个

 

     try

 

       {

 

         Console.WriteLine(“不设有的键””fff””的键值为:” +
myDic[“fff”]);

 

     }

 

     catch (KeyNotFoundException ex)

 

       {

 

         Console.WriteLine(“没有找到键引发那么些:” + ex.Message);

 

     }

 

     //化解地点的不行的措施是行使ContarnsKey()
来判断时候存在键,倘使平日要取健值得化最好用
TryGetValue方法来取得集合中的对应键值

 

     string value = “”;

 

     if (myDic.TryGetValue(“fff”, out value))

 

       {

 

         Console.WriteLine(“不存在的键””fff””的键值为:” + value );

 

     }

 

     else

 

       {     

 

         Console.WriteLine(“没有找到对应键的键值”); 

 

     }

 

     

 

     //上面用foreach 来遍历键值对

 

     //泛型结构体 用来储存健值对

 

     foreach (KeyValuePair<string, string> kvp in myDic)

 

       {

 

         Console.WriteLine(“key={0},value={1}”, kvp.Key, kvp.Value);

 

     }

 

     //获取值得集合

 

     foreach (string s in myDic.Values)

 

       {

 

         Console.WriteLine(“value={0}”, s);

 

     }

 

     //获取值得另一种艺术

 

     Dictionary<string, string>.ValueCollection values =
myDic.Values;

 

     foreach (string s in values)

 

       {

 

         Console.WriteLine(“value={0}”, s);

 

     }

 

 

常用的质量和格局如下 

 

 

 1.常用的习性

    属性表达 

 

 Comparer 

 获取用于鲜明字典中的键是还是不是等于的 IEqualityComparer。 

 

 Count 

 获取包涵在 Dictionary中的键/值对的数目。 

 

 Item 

 获取或安装与钦点的键相关联的值。

 

 Keys 

 获取包蕴 Dictionary中的键的汇聚。 

 

 Values 

 获取包罗 Dictionary中的值的聚集。 

 

 

 2.常用的措施

   方法表明 

 

 Add 

 将点名的键和值添加到字典中。 

 

 

 Clear 

 从 Dictionary中移除全部的键和值。 

 

  ContainsKey 

 明确 Dictionary是还是不是包括钦命的键。 

 

 ContainsValue 

 明确 Dictionary是不是包括特定值。 

 

 Equals  

 已重载。 明确五个 Object实例是不是等于。 (从 Object继承。) 

 

 GetEnumerator 

 重返循环访问 Dictionary的枚举数。 

 

 GetHashCode  

 用作一定类型的哈希函数。GetHashCode适合在哈希算法和数据结构(如哈希表)中接纳。
(从 Object继承。) 

 

 GetObjectData 

 完结 System.Runtime.Serialization.ISerializable接口,并赶回类别化
Dictionary实例所需的数量。 

 

 GetType  

 获取当前实例的 Type。 (从 Object继承。) 

 

 OnDeserialization 

 达成System.Runtime.Serialization.ISerializable接口,并在成就反连串化之后引发反体系化事件。 

 

 ReferenceEquals  

 鲜明钦赐的 Object实例是不是是相同的实例。 (从 Object继承。) 

 

 Remove 

 从 Dictionary中移除所钦点的键的值。 

 

 ToString  

 重返表示最近 Object的 String。 (从 Object继承。) 

 

 TryGetValue 

 获取与钦赐的键相关联的值。 

 

 

5.SortedList类 

 

与哈希表类似,区别在于SortedList中的Key数组排好序的 

 

//SortedList 

 

System.Collections.SortedList list=new System.Collections.SortedList(); 

 

list.Add(“key2”,2); 

 

list.Add(“key1”,1); 

 

for(int i=0;i<list.Count;i++) 

 

 

System.Console.WriteLine(list.GetKey(i)); 

 

 

 

 

6.Hashtable类 

 

哈希表,名-值对。类似于字典(比数组更强硬)。哈希表是通过优化的,访问下标的目的先散列过。如若以自由档次键值访问其申月素会快于别的集合。 

 

GetHashCode()方法再次来到一个int型数据,使用那个键的值生成该int型数据。哈希表获取那几个值最终回到3个索引,表示带有给定散列的数量项在字典中蕴藏的任务。 

 

Hashtable 和 Dictionary <K, V> 类型 

 1:单线程程序中推荐介绍应用 Dictionary, 有泛型优势, 且读取速度较快,
体量利用更丰硕.

 2:三十二线程程序中援引应用 Hashtable, 暗中同意的 Hashtable 允许单线程写入,
二十八线程读取, 对 Hashtable 进一步调用 Synchronized()
方法能够拿走完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用
lock 语句举办保险, 效用大减.

 3:Dictionary 有按插入顺序排列数据的特征 (注: 但当调用 Remove()
删除过节点后相继被打乱), 由此在急需反映顺序的田地中应用 Dictionary
能得到肯定方便.

 

 

HashTable中的key/value均为object类型,由包罗集合成分的囤积桶组成。存款和储蓄桶是
HashTable中各因素的虚拟子组,与抢先四分之二成团中开始展览的摸索和寻找相比较,存款和储蓄桶可令搜索和寻找更为便利。每一存款和储蓄桶都与3个哈希代码关联,该哈希代码是应用哈希函数生成的并基于该因素的键。HashTable的亮点就在于其索引的不二法门,速度十分的快。借使以自由档次键值访问其七月素会快于其余集合,特别是当数据量尤其大的时候,成效差异尤其大。

 

HashTable的应用场面有:做靶子缓存,树递归算法的代表,和种种需进步成效的地方。

 

    //Hashtable sample

    System.Collections.Hashtable ht = new
System.Collections.Hashtable(); 

    //–Be careful: Keys can’t be duplicated, and can’t be null—-

    ht.Add(1, “apple”);

    ht.Add(2, “banana”);

    ht.Add(3, “orange”);     

    //Modify item value:

    if(ht.ContainsKey(1))

        ht[1] = “appleBad”; 

    //The following code will return null oValue, no exception

    object oValue = ht[5];      

    //traversal 1:

    foreach (DictionaryEntry de in ht)

    {

        Console.WriteLine(de.Key);

        Console.WriteLine(de.Value);

    } 

    //traversal 2:

    System.Collections.IDictionaryEnumerator d = ht.GetEnumerator();

    while (d.MoveNext())

    {

        Console.WriteLine(“key:{0} value:{1}”, d.Entry.Key,
d.Entry.Value);

    } 

    //Clear items

    ht.Clear();

 

 

Dictionary和HashTable内部贯彻大概,但前者无需装箱拆箱操作,功用略高级中学一年级些。

 

    //Dictionary sample

    System.Collections.Generic.Dictionary<int, string> fruits =  
       new System.Collections.Generic.Dictionary<int, string>(); 

    fruits.Add(1, “apple”);

    fruits.Add(2, “banana”);

    fruits.Add(3, “orange”); 

    foreach (int i in fruits.Keys)

    {

        Console.WriteLine(“key:{0} value:{1}”, i, fruits);     }

 

    if (fruits.ContainsKey(1))

    {

        Console.WriteLine(“contain this key.”);

    }

 

 

HashTable是通过优化的,访问下标的对象先散列过,所以里面是冬季散列的,保险了高成效,也便是说,其出口不是安分守纪开首投入的逐条,而Dictionary遍历输出的依次,就是投入的次第,那点与Hashtable差异。即使一定要排序HashTable输出,只可以协调完毕:

 

    //Hashtable sorting

    System.Collections.ArrayList akeys = new
System.Collections.ArrayList(ht.Keys); //from Hashtable

    akeys.Sort(); //Sort by leading letter

    foreach (string skey in akeys)

    {

        Console.Write(skey + “:”);

        Console.WriteLine(ht[skey]);

    }

 

 

HashTable与线程安全:

 

为了保障在十二线程的景况下的线程同步访问安全,微软提供了电动线程同步的HashTable: 

 

若是 HashTable要允许并发读但只可以贰个线程写, 要这么创立 HashTable实例:

 

    //Thread safe HashTable

    System.Collections.Hashtable htSyn =
System.Collections.Hashtable.Synchronized(new
System.Collections.Hashtable());

 

那样, 假使有七个线程并发的谋划写HashTable里面包车型地铁 item,
则同临时刻只能有一个线程写, 别的阻塞; 对读的线程则不受影响。

 

 

其余一种办法正是采取lock语句,但要lock的不是HashTable,而是其SyncRoot;即使不引进那种方法,但效能一样的,因为源代码就是那样完结的:

 

//Thread safe

 

private static System.Collections.Hashtable htCache = new
System.Collections.Hashtable ();

 

 

 

public static void AccessCache ()

 

{

 

    lock ( htCache.SyncRoot )

 

    {

 

        htCache.Add ( “key”, “value” );

 

 

 

        //Be careful: don’t use foreach to operation on the whole
collection

 

        //Otherwise the collection won’t be locked correctly even though
indicated locked

 

        //–by MSDN

 

    }

 

}

 

 

 

//Is equivalent to 等同于 (lock is equivalent to Monitor.Enter and
Exit()

 

public static void AccessCache ()

 

{

 

    System.Threading.Monitor.Enter ( htCache.SyncRoot );

 

    try

 

    {

 

        /* critical section */

 

        htCache.Add ( “key”, “value” );

 

 

        //Be careful: don’t use foreach to operation on the whole
collection

 

        //Otherwise the collection won’t be locked correctly even though
indicated locked

 

        //–by MSDN

 

    }

 

    finally

 

    {

 

        System.Threading.Monitor.Exit ( htCache.SyncRoot );

 

    }

 

}

 

7.Stack类 

 

栈,后进先出。push方法入栈,pop方法出栈。

 

System.Collections.Stack stack=new System.Collections.Stack(); 

 

stack.Push(1); 

 

stack.Push(2); 

 

 

 

System.Console.WriteLine(stack.Peek()); 

 

while(stack.Count>0) 

 

 

System.Console.WriteLine(stack.Pop()); 

 

 

 

 

8.Queue类 

 

队列,先进先出。enqueue方法入队列,dequeue方法出游列。 

 

System.Collections.Queue queue=new System.Collections.Queue(); 

 

queue.Enqueue(1); 

 

queue.Enqueue(2); 

 

 

System.Console.WriteLine(queue.Peek()); 

 

while(queue.Count>0) 

 

 

System.Console.WriteLine(queue.Dequeue()); 

 

Leave a Comment.