C#集合。

集合命名空间:

  using system.collections. 非泛型集合

  using system.collections.Generic.  泛型集合

为什么要用集合:

  1、数组一旦声明长度就固定了。

  2、集合有很多方法可以用

  等

常用集合:

类似数组集合:ArrayList  List<>

键值对集合:Hashtable  Dictionary<K V>

栈集合:Stack

队列:Queye

ArrayList:

 class Program
    {      
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();
            arrayList.Add(1); //增加一个元素
            arrayList.AddRange(new int[] { 2, 3 });//增加一个集合
            arrayList.Insert(0, "开始:");//在指定位子插入一个元素
            arrayList.InsertRange(4, new string[] { "", "", "" });//指定位置插入集合
            arrayList.RemoveAt(7);
            arrayList.Clear();//清空集合
            for (int i = 0; i < arrayList.Count; i++)
            {
                Console.WriteLine(arrayList[i]);
            }
        }    
    }

Remove()不是根据对象来判断的,而是根据值来判断。

Contains()是否包含某个值,也是根据值来判断的。

集合转为数组:.ToArray().

排序:  1、.sort() 升序  没有降序   可以用.Reverse()颠倒位置实现。

    2、想让任何集合实现排序需要实现 IComparable接口 。

    3、直接调用sort是使用ICompareble 接口的默认方式来排序。可以用sort的重载,使用自己的比较器。

Hashtable:

简单添加和获取:

class Program
    {      
        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            hashtable.Add("Sam", "Sam");
            hashtable.Add("Penny", new Person() { Name = "Penny" });
            Console.WriteLine(hashtable["Sam"]);
            Person Penny = hashtable["Penny"] as Person;
            Console.WriteLine(Penny.Name);

        }    
    }

键值对集合的键不能重复。

判断是否存在某个键:.ContentsKey()    是否存在某个值:.ContentsValue()

遍历Hash table:

class Program
    {      
        static void Main(string[] args)
        {
            Hashtable hashtable = new Hashtable();
            hashtable.Add("Sam", "Sam");
            hashtable.Add("Penny", "Penny");
            //遍历键
            foreach (object item in hashtable.Keys)
            {
                Console.WriteLine("Key:{0}----Value:{1}",item,hashtable[item]);
            }
            //遍历值
            foreach (object item in hashtable.Values)
            {
                Console.WriteLine("Value:{0}",item);
            }
            //遍历键值对
            foreach (DictionaryEntry item in hashtable)
            {
                Console.WriteLine("Key:{0}---Value{1}",item.Key,item.Value);
            }

        }    
    }

集合小练习:

两个ArrryList集合的并集。

class Program
    {      
        static void Main(string[] args)
        {
            ArrayList A = new ArrayList(new string[] {"a","b"});
            ArrayList B = new ArrayList(new string[] { "a", "b","c","d" });
            for (int i = 0; i <B.Count; i++)
            {
                if (!A.Contains(B[i]))
                {
                    A.Add(B[i]);
                }
            }
            for (int i = 0; i < A.Count; i++)
            {
                Console.WriteLine(A[i]);
            }
        }    
    }

随机生成十个1-100之间的数放到arraylist中,这些数必须是偶数且不能重复。

class Program
    {      
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();
            Random random = new Random();
            while (arrayList.Count<10)
            {
                int r = random.Next(1, 101);
                if (!arrayList.Contains(r)&&((r%2)==0))
                {
                    arrayList.Add(r);
                }
            }
            for (int i = 0; i < arrayList.Count; i++)
            {
                Console.WriteLine(arrayList[i]);
            }
        }    
    }

上面程序把random放循环外面效率更好,因为无参的random构造函数以系统时间为种子,而一遍循环完了以后时间还没来得及变,就会生成相同的数。

泛型集合: 

List<string> list = new List<string> () 

和 arraylist相比:

  数据类型固定,有更多的方法可以用。

Dictionary<string, int> dic = new Dictionary<string, int> ;

和hashtable相比:

  键和值都有类型约束。

遍历键值对:

 class Program
    {      
        static void Main(string[] args)
        {
            Dictionary<string, int> dic = new Dictionary<string, int>();
            dic.Add("Sam", 22);
            dic.Add("Penny", 23);
            foreach (KeyValuePair<string,int> item in dic)
            {
                Console.WriteLine("keys:{0}--value:{1}",item.Key,item.Value);
            }
        }    
    }

判断字符串中每个字母出现的次数:

class Program
    {      
        static void Main(string[] args)
        {
            string str = "wellcome to china";
            Dictionary<char, int> dict = new Dictionary<char, int>();
            for (int i = 0; i < str.Length; i++)
            {
                if (char.IsLetter(str[i]))
                {
                    if (dict.ContainsKey(str[i]))
                    {
                        dict[str[i]]++;
                    }
                    else
                    {
                        dict.Add(str[i], 1);
                    }
                }
            }
            foreach (KeyValuePair<char,int> item in dict)
            {
                Console.WriteLine("{0}----{1}",item.Key,item.Value);
            }
        }    
    }

 

posted @ 2019-03-14 10:44  张玉昊  阅读(334)  评论(0编辑  收藏  举报