我的C#学习笔记(二)集合

作者 Zhendong Ho 日期 2018-08-28
C#
我的C#学习笔记(二)集合

ArrayList集合

集合和数组

集合:很多数据的一个集合。

数组:长度不可变,类型单一。

集合的好处:长度可以任意改变,类型随便。

//创建了一个集合对象
ArrayList list = new ArrayList();

ArrayList的各种方法

Add:添加单个元素

  1. Add方法可以给集合添加一个数据。
  2. 数据可以是各种类型的数据,也可以是数组,类,集合类型的数据。
  3. 如果集合中添加的数据是数组,类,集合类型时,它们用ToString方法输出是命名空间
//给集合添加一个数据
list.Add(1);
list.Add(3.14);
list.Add("张三");
list.Add(true);
list.Add('男');

//给集合添加数组,类,集合类型的数据
list.Add(new int[] { 1, 2, 3, 4, 5}); //输出System.Int32[]
Person p = new Person();
list.Add(p); //输出Person
list.Add(list); //输出System.Collections.ArrayList

AddRange:添加集合元素

//添加集合元素
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9});
list.AddRange(list);

Clear:移除所有元素

//清空所有元素
list.Clear();

Remove:删除单个元素

//删除单个元素
list.Remove(true);//删除元素true

RemoveAt:根据下标去删除元素

//根据下标去删除元素
list.RemoveAt(0);//删除索引为0的元素

RemoveRange:根据下标去移除一定范围内的元素

//根据索引删除一定范围的元素
list.RemoveRange(0, 3);//删除索引是0-3的元素

Sort:升序排列

list.Sort();

Reverse:反转

list.Reverse();

Insert:在指定的位置插入一个元素

list.Insert(1, "插入的");//在索引为1的元素之前插入字符串

InsertRange:在指定的位置插入集合

list.InsertRange(0, new string[] { "张三", "李四" });//在索引为0的元素之前插入集合

Contains:判断是否包含某个指定元素

bool b = list.Contains(true)

集合的长度问题

Count:表示这个集合中实际包含的元素的个数。

Capacity:表示这个集合中可以包含的元素的个数。

  • 当集合中没有元素时,属性Count和属性Capacity的值都为0。
ArrayList list = new ArrayList();
Console.WriteLine(list.Count);//0
Console.WriteLine(list.Capacity);//0
  • 当集合中有一个元素时,属性Count为1,属性Capacity为4。
ArrayList list = new ArrayList();
list.Add(1);
Console.WriteLine(list.Count);//1
Console.WriteLine(list.Capacity)//4

注意:每次集合中实际包含的元素个数(Count)超过了可以包含的元素个数(Capacity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。

HashTable键值对集合

创建一个键值对集合

//创建一个键值对集合
Hashtable ht = new Hashtable();
ht.Add(1, "张三");
ht.Add(2, true);
ht.Add(3, '男');
ht.Add(false, "错误的");

遍历键值对集合

foreach(var item in ht.Keys)
{
Console.WriteLine("键是{0}---值是{1}", item, ht[item]);
}

添加数据的方式

//通过Add方法添加
Hashtable ht = new Hashtable();
ht.Add(1, "张三");
ht.Add(2, "李四");
//通过索引赋值添加
ht[3] = "新来的";
ht[1] = "把张三干掉";

清空键值对

//移除集合中所有的元素
ht.Clear();

根据键移除元素

//根据键移除元素
ht.Remove(3)

在添加数前先判断键是否存在

//abc---cba
if (!ht.ContainsKey("abc"))
{
ht.Add("abc", "cba");
}
else
{
Console.WriteLine("已经包含该键");
}

注意

  1. 在键值对中,我们是根据键去找值的。
  2. 键值对对象[键] = 值。
  3. 键值对集合当中,键必须是唯一的,而值是可以重复的。
  4. 通过索引赋值添加数据时,如果没有新添加的键,如ht[3] = “新来的”,则添加。如果存在该键,如ht[1] = “把张三干掉”,则重新赋值。

Var推断类型

var作用

  • var根据变量的值来推断出变量的类型,又叫做隐式类型

强类型语言和弱类型语言

  • C#是一门强类型语言:在代码当中,必须对每一个变量的类型有一个明确的定义。
  • JavaScript是一门弱类型语言:可以用var声明任何变量。

var的优缺点

优点:声明简单,书写方便。

缺点:在声明的同时必须赋值。

for循环和foreach循环

计算程序运行的时间Stopwatch

//计算for循环一定次数所用的时间
Stopwatch sw = new Stopwatch();
for (int i = 0; i < 10000000000; i++)
{

}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();

两者区别

  • 在循环次数不高的时候,for和foreach两者的效率基本一致。
  • 在循环次数十分巨大的时候,foreach的效率要比for高很多倍。
  • 在写法上,foreach的写法要稍微简单一些。

List泛型集合

创建泛型集合对象

//创建泛型集合对象
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);

list.AddRange(new int[] { 1, 2, 3, 4, 5, 6});
list.AddRange(list);

List泛型集合转换为数组

//List泛型集合转换为数组
int[] nums = list.ToArray();//ToArray的返回值取决于list的类型

List<string> listStr = new List<string>();
string[] str = listStr.ToArray();

数组转为List集合

//数组转为List集合
List<int> listInt = nums.ToList();//ToList的返回值取决于数组的类型

char[] chs = new char[] { 'c', 'b', 'a' };
list<char> listChar = chs.ToList();

装箱、拆箱

装箱:将值类型转换为引用类型。

拆箱:将引用类型转换为值类型。

int n = 10;
object o = n;//装箱
int nn = (int)o;//拆箱

ArrayList和List泛型集合的区别

为什么使用List泛型集合而不使用ArrayList?

  1. ArrayList操作的是Object类型,可能会发生装箱操作。
  2. 装箱就会不停地做类型转换,影响性能,应该避免装箱和拆箱。
ArrayList list = new ArrayList();
//List<int> list = new List<int>();
Stopwatch sw = new Stopwatch();
sw.Start();
//这个循环发生了100万次装箱操作
for (int i = 0; i < 10000000; i++)
{
list.Add(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);//List泛型集合比ArrayList操作快10倍左右
Console.ReadKey();

装箱和拆箱的条件

判断两种类型是否发生了装箱或者拆箱:

  • 如果两种类型是继承关系,则有可能发生装箱或者拆箱。
  • 如果两种类型没有任何继承关系,则没有发生任何装箱或者拆箱。
//这个地方没有发生任何的装箱
string str = "123";
int n = Convert.ToInt32(str);//int和string类型没有任何继承关系

//发生了装箱
int a = 10;
IComparable i = a;//int继承自IComparable接口

字典集合

字典集合的键和值都是确定的(与Hashtable)。

字典集合的键不能够重复。

创建字典集合

//创建字典集合
Dictionary<int, string> dic = new Dictionary<int, string>();//字典集合的键和值都是确定的
dic.Add(1, "张三");
dic.Add(2, "李四");
dic.Add(3, "王五");
dic.Add(1, "abc");//错误,字典集合的键不能够重复
dic[1] = "新来的";//正确,对键为1的键值对重新赋值

普通方法遍历字典集合

foreach (var item in dic.Key)
{
Console.WriteLine("{0}---{1}", item, dic[item]);
}
Console.ReadKey();

简便方法遍历字典集合

foreach (KeyValuePair<int, string> kv in dic)
{
Console.WriteLine("{0}---{1}", kv.Key, kv.Value);
}
Console.ReadKey();