集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。
- ArrayList集合
-
1,ArrayList集合定义数组时,不需要初始化其大小:
例: ArrayList animalArrayList = new ArrayList();
但,使用array方法定义数组时:
Animal[] animalArrayList2 = new Animal[5];
2.ArrayList的.Add()方法给数组添加新项。
3,ArrayList也支持foreach。
4,ArrayList数组中输出元素的个数用.count
普通数组使用.length
5,.RemoveAt([index])可用于删除集合中的索引项多代表的对象
.Remove([对象名])直接删除集合中的对象。
当删除完某个对象(或对应索引时),后面的所有对象会向前移动一位
6,.AddRange([项]),用于ArrayList添加项。此项可以接受ICollection接口的任何对象,包括数组。
ArrayList list = new ArrayList();
//添加单个元素
list.Add(true);
list.Add(1);
list.Add("张三");
list.Clear();清空所有元素
list.Remove(true);删除单个元素 写谁就删出谁
list.RemoveAt(0);根据下标去删除元素
list.RemoveRange(0, 3);根据下标去移除一定范围的元素
list.Insert(1, "插入的");在指定的位置插入一个元素
bool b = list.Contains(1);判断是否包含某个指定的元素
list.Add("大男孩");
if (!list.Contains("大男孩"))
{
list.Add("大男孩");
}else{
Console.WriteLine("已经有了");
}
//循环打印
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
list.Sort();//升序排列
list.Reverse();反转
1、添加同一对象
using System.Collections.Generic;
public class Test(){
User u1 = new User ();
u1.Id = 101;
u1.Name = "张三";
User u2 = new User();
u2.Id = 102;
u2.Name = "李四";
ArrayList list = new ArrayList();
list.Add(u1);
list.Add(u2);
foreach(User u in list)
{
Debug.Log(u.Id + "\t" + u.Name);
}
}
2、添加多个不同对象
ArrayList list = new ArrayList();
User u=new User();
u1.Id = 101;
u1.Name = "张三";
Student s=new Student();
s.Id = 101;
s.Name = "李四";
list.Add(u);
list.Add(s);
foreach (object obj in list)
{
if (obj is Student)
{
Debug.Log("AAA");
}
if (obj is User)
{
Debug.Log("BBB");
}
}
IEnumerator :迭代器 [i'nju:mə,reitə]
IEnumerator it = list.GetEnumerator();
while(it.MoveNext()){
User u = (User)it.Current;
it.MoveNext();
Student s=(Student)it.Current;
Console.WriteLine(u.Name+"\t"+s.Name);
}
3、模板:template
class Chinese
{
string name;
int age;
}
class American
{
string name;
int age;
}
class Person<T>
{
T name;
T age;
}
class Test
{
static void Main(string[] args)
{
Person<Chinese> chinese = new Person<Chinese>();
Person<American> american = new Person<American>();
}
}
4、泛型
泛型是程序设计语言的一种特性,允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。
在应用程序中存储数据最简单的容器是数组,但无法满足数据的动态伸缩,为了摆脱这些数组的限制,.net基础类库发布了很多包含集合类的命名空间,集合类的尺寸是动态的,可以在运行时插入或者移除数据项,集合类包括两类:
1.非泛型集合:
主要位于System.Collections命名空间,包括ArraryList,BitArray,Stack,Queue等类,同时System.Collections.Specialized下的ListDictionary等类以及一些接口。
非泛型集合存在的问题:
1)性能问题:.Net支持两大数据类型:值类型和引用类型,有时候需要用某个类别的变量表示另外一个类别的变量,c#提供了装箱的机制将值类型的数据保存在引用类型中,装箱的实际定义为CLR会在堆上分配新的对象,将值类型的值赋予新的实例,并返回新的对象的引用。相反的操作为拆箱,拆箱是将保存在对象引用上的值转换回栈上相应的值类型,CLR会验证收到的值类型是否是装箱的值类型,如果是就将值赋值回本地值类型,如果不是则抛出异常。尽管装箱和拆箱都很方便,但带来的栈/堆内存的转移会导致性能问题。
2)类型安全问题
除了拆箱的时候我们需要记住装箱的值类型,还需要类型安全的容器来操作某些特定的数据类型,在引入泛型之前,需要通过手工创建强类型的集合类。
2.泛型集合
使用泛型集合可以解决上面的问题,包括性能的损失,泛型更类型安全,以及无需手工创建强类型的集合类,只需使用泛型集合并制定类型。
List<string> list = new List<string>();
list.Add("张三");
list.Add("李四");
list.Add("王五");
list.Add("田六");
list.Add("赵七");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("for循环:" + list[i]);
}
list.RemoveAt(0);
foreach (string item in list)
{
Console.WriteLine("foreach迭代:" + item);
}
- 栈
后进先出
Stack<int> s = new Stack<int>();
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
//Console.WriteLine(s.Peek());
// Console.WriteLine(s.Pop());
foreach (var item in s)
{
Console.WriteLine(item);
}
- 队列
先进先出
Queue<int> q = new Queue<int>();
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
q.Enqueue(4);
//Console.WriteLine(q.Peek());
//Console.WriteLine(q.Dequeue());
foreach (var item in q)
{
Console.WriteLine(item);
}
- 字典
无序字典
Dictionary<int, string> d = new Dictionary<int, string>();
d.Add(1, "a");
d.Add(3, "c");
d.Add(4, "d");
d.Add(2, "b");
foreach (var item in d.Keys)
{
Console.WriteLine(item+"\t"+d[item]);
}
有序字典
SortedDictionary<int, string> d = new SortedDictionary<int, string>();
d.Add(1, "a");
d.Add(3, "c");
d.Add(4, "d");
d.Add(2, "b");
//正序
foreach (var item in d.Keys)
{
Console.WriteLine(item + "\t" + d[item]);
}
//倒序
foreach (var item in d.Reverse())
{
Console.WriteLine(item.Key + "\t" + item.Value);
}