黑马程序员:集合类的CRUD

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

ArrayList 可变长度数组,使用类似于数组

属性 Capacity(集合中可以容纳元素的个数,翻倍增长); Count(集合中实际存放的元素的个数。)
方法 
Add()  AddRange(Icollection c)  Remove() RemoveAt() Clear() 
Contains()  ToArray() Sort() 排序\Reverse();//反转
Hashtable 键值对的集合,类似于字典,Hashtable在查找元素的时候,速度很快。 
Add(object key,object value);
hash[“key”]
hash[“key”]=“修改”;
.ContainsKey(“key”);
Remove(“key”);
遍历:
hash.Keys
hash.Values/DictionaryEntry
键值对集合中的“键”,绝对不能重复。
ArrayList (非泛型)→ List<T>(泛型)
Hashtable(非泛型) → Dictionary<K,V>(泛型)


GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。 
GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。 
GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。 
用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。如果用作键的对象不提供 GetHashCode 的有用实现,您可以在构造 Hashtable 对象时指定哈希代码提供程序。在 .NET Framework 2.0 版之前,哈希代码提供程序是基于 System.Collections.IHashCodeProvider 接口的。从 2.0 版开始,哈希代码提供程序基于 System.Collections.IEqualityComparer 接口。 
对实现者的说明: 
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。 
哈希函数必须具有以下特点: 
如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。 
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。 
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。 
例如,String 类提供的 GetHashCode 方法的实现为相同的字符串值返回相同的哈希代码。因此,如果两个 String 对象表示相同的字符串值,则它们返回相同的哈希代码。另外,该方法使用字符串中的所有字符生成相当随机的分布式输出,即使当输入集中在某些范围内时(例如,许多用户可能有只包含低位 128 个 ASCII 字符的字符串,即使字符串可以包含 65,535 个 Unicode 字符中的任何字符)。 
对于 Object 的派生类,当且仅当此派生类将值相等性定义为引用相等并且类型不是值类型时,GetHashCode 方法才可以委托给 Object.GetHashCode 实现。 
在类上提供好的哈希函数可以显著影响将这些对象添加到哈希表的性能。在具有好的哈希函数实现的哈希表中,搜索元素所用的时间是固定的(例如运算复杂度为 O(1) 的运算)。而在具有不好的哈希函数实现的哈希表中,搜索性能取决于哈希表中的项数(例如运算复杂度为 O(n) 的运算,其中的 n 是哈希表中的项数)。哈希函数的计算成本也必须不高。 
GetHashCode 方法的实现必须不会导致循环引用。例如,如果 ClassA.GetHashCode 调用 ClassB.GetHashCode,ClassB.GetHashCode 必须不直接或间接调用 ClassA.GetHashCode。 
GetHashCode 方法的实现必须不引发异常。 
重写 GetHashCode 的派生类还必须重写 Equals,以保证被视为相等的两个对象具有相同的哈希代码;否则,Hashtable 类型可能无法正常工作。 






//看运行速度
  Stopwatch sw = new Stopwatch();
            sw.Start();
            myDic.ContainsKey("china");
            sw.Stop();
            MessageBox.Show(sw.Elapsed.ToString());


class KeyPair
    {
        private string key;
        public string Key
        {
          get { return key; }
          set { key = value; }
        }


        private string value;
        public string Value
        {
            get { return this.value; }
          set { this.value = value; }
        }
    }
    class MyDict
    {
        List<KeyPair> list = new List<KeyPair>();


        public void Add(KeyPair kp)
        {
            list.Add(kp);
        }


        public bool ContainsKey(string key)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].Key == key)
                {
                    return true;
                }
            }
            return false;
        }
    }






Array是所有数组的父类。


ArrayList集合中可以存放任何类型的数据,
但是无论什么类型的数据放到ArrayList中以后都变成了Object类型。
所以从ArrayList中取出的数据需要类型转换。


不要把Random的实例化放到循环里面!
可以使用两个集合来降低产生随机数的循环次数。 
Random在循环中会降低执行效率(每次new的时候的种子是一样的,当前时间。)


命名空间System.Collections.Generic
List<T>类似于ArrayList,ArrayList的升级版。
各种方法:Sort()、Max()、Min()、Sum()…
Dictionary<K,V>类似于Hashtable,Hashtable的升级版。
推荐使用泛型集合。
T,K,V就像一把锁,锁住集合只能存某种特定的类型,这里的T,K,V也可以是其它字母 
泛型集合可以进行foreach遍历,是因为实现了IEnumerable<T>具有了GetEnumerator()方法


ArrayList al1 = new ArrayList() { "a","b","c","d","e"};
            ArrayList al2 = new ArrayList() { "d", "e", "f", "g", "h" };
            ArrayList al3 = new ArrayList();


            al3.AddRange(al1);
            foreach (string str in al2)
            {
                if (!al3.Contains(str)) 
                {
                    al3.Add(str);
                }
            }
            foreach (string str in al3)
            {
                Console.WriteLine(str);
            }


============================
ArrayList al = new ArrayList();
            Random ran = new Random();


            while (al.Count < 10)
            {
                int num = ran.Next(1,31);
                if (num % 2 == 0)
                {
                    //如果集合中不包含num的话
                    if (!al.Contains(num))
                    {
                        al.Add(num);
                    }
                }
            }


=======================================
string s = "5 8 9 10 11 22 4 3";
            ArrayList al1 = new ArrayList();
            ArrayList al2 = new ArrayList();
            
            string[] arr = s.Split(' ');
            foreach (string item in arr)
            {
                int n = int.Parse(item);
                if (n % 2 != 0)
                {
                    al1.Add(n);
                }
                else 
                {
                    al2.Add(n);
                }
            }

al1.AddRange(a2)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值