集合
集合:很多类型的一个集合
数组:长度不可变,类型单一
集合的好处:长度可以任意改变,类型随便
泛型集合:长度可以任意改变,类型单一
ArrayList集合和Hashtable都在System.Collections
集合类型 | 特点 |
---|---|
数组 | 长度不可变,类型单一,类型存放进去类型不变 |
ArrayList | 长度可变,可以存放任意类型,类型存放进去转换为object类型 |
List<> | 长度可变,和ArrayList对应,但是只能存放单一类型,类型存放进去类型不变 |
Hashtable | 长度可变,键值对集合,可以存放任意类型,类型存放进去转换为object类型 |
Dictionary<> | 长度可变,键值对集合,和Dictionary对应,只能存放单一类型,类型存放进去类型不变 |
ArrayList集合
常用方法
添加元素
- list.Add()
我们将一个对象输出到控制台,默认情况下,打印的就是这个对象所在的类的命名空间。
using System.Collections;
using 集合练习;
Person p = new Person();
ArrayList list = new ArrayList();
list.Add(1);
list.Add(3.14);
list.Add(true);
list.Add("张三");
list.Add(5000m);
list.Add(new int[] { 1,2,3,4,5,6,7,8,9});
list.Add(p);
list.Add(list);
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();
运行结果:
往list里面加任何类型的元素之后,都会转换成object类型,所以放进去类之后,我们想要得到类的内容,我们需要将object类强转成子类。
- list.AddRange()
往集合里面添加数组或者集合的时候,用list.AddRange();
list.AddRange(new int[]{1,2,3,4,5});
list.AddRange(list);
需要注意的是,添加集合或数组的时候,这个集合和数组不是作为一个元素添加进去的.数组和集合里的元素都将作为被添加集合的元素.
删除元素
-
list.Clear()
删除全部元素
-
list.Remove(item)
删除单个元素,写谁删谁
-
list.RemoveAt(index)
根据下标删除单个元素
-
list.RemoveRange(StartIndex,EndIndex)
根据下标去移除一定范围的元素
排序
-
list.Sort()
元素排序
-
list.Reverse()
元素反转
插入元素
-
list.Insert(index,item)
在指定的位置插入一个元素
-
list.InsetRange(index,item)
在指定的位置插入一个数组或集合
查找元素
-
list.Contains(item)
判断集合中是否有某个元素
集合长度的问题
count和capcity两个属性
-
list.Count
表示这个集合中实际包含的元素的个数
-
list.Capcity
表示这个集合中可以包含的元素的个数
每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用.
Hashtable集合
基本概念
Hashtable 键值对集合[注意:t为小写]
foreach 的效率远远高于for循环
键值对集合对象中,键必须是唯一的,值可以重复。
var
C#是一门强类型语言
var可以根据变量的赋值自动判断类型,但是尽量别用
常用方法
键值对集合对象[键] = 值;
using System.Collections;
Hashtable ht = new Hashtable();
ht.Add(1, "张三");
ht.Add(2, true);
ht.Add(3, '男');
ht.Add(false, "错误的");
//在键值对集合中,是根据键去找值的
foreach (var item in ht)
{
Console.WriteLine(item);
//Console.WriteLine(ht[item]);
}
Console.WriteLine("==========================");
foreach (var item in ht.Keys)
{
Console.WriteLine(item);
//Console.WriteLine(ht[item]);
}
Console.WriteLine("==========================");
foreach (var item in ht.Values)
{
Console.WriteLine(item);
//Console.WriteLine(ht[item]);
}
Console.WriteLine("==========================");
注意:使用foreach遍历集合元素的时候,不能直接输出,例如上面的输出为:
直接遍历Hashtable输出的是元素对象的命名空间。
添加数据的方式
-
ht.Add(键,值)
这种方法不会检查有没有重复的键
-
ht[键] = 值;
这种方法首先会检查当前集合中有没有该键,如果没有,则新建一个,如果有,则覆盖。
检查是否包含元素
-
ht.Contains()
-
ht.ContainsKey()
-
ht.ContainsValue()
移除元素
- ht.Clear()
- ht.Remove()
泛型集合
定义与赋值
List<int> list = new List<>();
list.Add(1);
list.AddRange(new int[] {2,3,4,5,6});
list.AddRange(list);
集合和数组之间的转换
int[] nums = list.ToArray();
List<int> list2 = nums.ToList();
string[] strs = listStr.ToArray();
List<string> listStr = strs.ToList();
字典集合
用法
//Dictionary<int, string> dic = new Dictionary<int, string>();
//dic.Add(1,"zhangsan");
//dic.Add(2,"lisi");
//dic.Add(3,"wangwu");
//Console.WriteLine(dic[1]);
//dic[1] = "新来的";
//Console.WriteLine(dic[1]);
//foreach (int item in dic.Keys)
//{
// Console.WriteLine("{0}---{1}",item,dic[item]);
//}
//foreach (KeyValuePair<int,string> kv in dic)
//{
// Console.WriteLine("{0}---{1}",kv.Key,kv.Value);
//}
//Console.ReadKey();
//将一个数组中的奇数放在一个集合中,再将偶数放在另一个集合中
//最终将两个集合合并为一个集合,并且奇数显示在左边,偶数显示在右边
using System.Collections;
int[] nums = new int[]{ 0,2,5,6,9,87,46,1,489,56};
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
foreach (int item in nums)
{
if (item%2 == 0)
{
list2.Add(item);
}
else
{
list1.Add(item);
}
}
list1.AddRange(list2);
foreach (int item in list1)
{
Console.Write(item+" ");
}
Console.WriteLine();
//提醒用户输出一个字符串,通过foreach循环将用户输入的字符串赋值
//给一个字符数组
String strOfUsers = Console.ReadLine();
List<char> strsOfUsers = new List<char>();
foreach (var item in strOfUsers)
{
strsOfUsers.Add(item);
}
//统计 Welcome to China中每个字符出现的次数,不考虑大小写。
string strWelcome = "Welcome to China";
strWelcome = strWelcome.ToLower();//分析一下这一句,内存空间有没有更改?
Dictionary<char, int> dicCount = new Dictionary<char,int>();
foreach (char item in strWelcome)
{
if (dicCount.Keys.Contains(item))
{
dicCount[item] += 1;
}
else
{
dicCount.Add(item,1);
}
}
Console.ReadKey();