数组是集合,但集合不一定是数组。
数组存储的类型不限制。集合存储的类型只能是引用类型。
数组(一般是相同数据类型,但object[]数组元素类型可以不同)的元素按一定顺序排列集合。
数组在添加,插入,删除等比方便,说明数组不是链表,但数组的读取(查询)速度比集合快。
集合是线性表,在插入,添加,删除数据时比较方面,性能比数组高。
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
数组实现了6个接口,前4个接口很重要
ICloneable接口控制克隆,复制对象
IList列表接口,控制对象操作(添加,删除等)
IEnumerable可枚举对象的接口,控制是对象的循环
ICollection集合接口,控制复制对象
public interface IList :ICollection,IEnumerable 说明列表也是集合的一种。
public class ArrayList:IList,ICollection,IEnumerable,ICloneable
Public class List
列表:表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法
List
List
的线程安全版本,如ConcurrentBag
。在C#中,ArrayList
是一个非泛型集合类,属于 System.Collections
命名空间。它提供了一种灵活的方式来存储和管理对象的有序集合。ArrayList
是一种动态数组,可以根据需要自动调整其大小。
public class ArrayList : IList, ICollection,IEnumerable, ICloneable
IList列表,ICollection集合
IEnumerable可枚举,可迭代,可循环
ICloneable可克隆,可复制
ArrayList arrayList1 = new ArrayList();//没有指定容量(常用)
ArrayList arrayList2 = new ArrayList(3); //指定容量,提醒: 没有存储任何的项,长度还是0
ArrayList arrayList3 = new ArrayList(new int[] {1,2,3});//放一个实现ICollection接口的集合
动态数组:ArrayList
可以自动调整其大小以适应添加的元素数量。这使得它在需要存储不确定数量的元素时非常方便。
类型不安全:ArrayList
可以存储任何类型的对象,因为它的元素类型是 object
。这意味着在使用元素时,可能需要进行类型转换,这可能会引入运行时错误。
添加和删除元素:ArrayList
提供了 Add
和 Remove
方法来添加和删除元素。当添加元素时,如果数组已满,ArrayList
会自动创建一个新的数组并将旧数组的元素复制到新数组中。注意:注意装箱,支持多种数据类型,取值时要拆箱。
//添加
arrayList1.Add(1);
arrayList1.Add("ac");
arrayList1.Add(true);
//删除
arrayList1.Remove("ac");//按值删除
arrayList1.Remove(3);//按索引删除,有可能索引越界
Rang范围,可以一次添加多个。
arrayList1.AddRange(new object[] {"hello",false,213});
arrayList1.AddRange(new List {1,2,3 });
arrayList1.AddRange(new Dictionary()
{
{"key1","value1" },
{"key2","value2" }
});
索引访问:可以通过索引访问 ArrayList
中的元素,就像访问数组一样。索引从零开始。
Console.WriteLine(arrayList1.IndexOf(1)); // 0
Console.WriteLine(arrayList1.IndexOf("abc")); // 1
Console.WriteLine(arrayList1.IndexOf(200)); // -1
Console.WriteLine(arrayList1.LastIndexOf(1)); // 0
Console.WriteLine(arrayList1.LastIndexOf("abc")); // 1
Console.WriteLine(arrayList1.LastIndexOf(200)); // -1
容量和大小:ArrayList
有一个 Capacity
属性,表示可以存储的最大元素数。还有一个 Count
属性,表示当前存储的元素数。
排序:ArrayList
提供了 Sort
方法,可以对集合中的元素进行排序。
查找:可以使用 IndexOf
方法查找元素在 ArrayList
中的位置。
复制:可以使用 CopyTo
方法将 ArrayList
中的元素复制到一个数组中。
同步:ArrayList
不是线程安全的。如果你需要在多线程环境中使用它,可以使用 ArrayList.Synchronized
方法创建一个线程安全的 ArrayList
。
清空
arrayList1.Clear();
实例:
using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList list = new ArrayList();
// 添加元素
list.Add("Hello");
list.Add(123);
list.Add(DateTime.Now);
// 访问元素
Console.WriteLine(list[0]); // 输出 "Hello"
Console.WriteLine(list[1]); // 输出 123
Console.WriteLine(list[2]); // 输出当前日期和时间
// 删除元素
list.Remove(123);
// 显示元素
foreach (var item in list)
{
Console.WriteLine(item);
}
// 获取元素数量
Console.WriteLine("Count: " + list.Count);
// 获取最大容量
Console.WriteLine("Capacity: " + list.Capacity);
}
}
列表List对象,也是集合,并且是最流行集合
List列表中的数据类型是统一的
List
也称泛型列表。和ArrayList集合最大区别:List列表中的项类型是统一的,而ArrayList集合中的项类型可以不同。
定义(格式):List<数据类型,类> 声明名字=new List<数据类型,类>(){值1,值2,值3};
List list1 = new List() { 1,1,1};
List list2 = new List() { "abc" };
Student one = new Student() { Id = 1, Name = "张三1" };
List student1 = new List() {
one,
new Student(){ Id=2,Name="张三1"},
new Student(){ Id=3,Name="张三2"},
};
FindAll()正向查多项,Find()正向查一项,FindLast()倒查一项
List stus = student1.FindAll(stu => stu.Name == "张三1");
Student stu1 = student1.Find(stu => stu.Name == "张三1");
Student stu2 = student1.FindLast(stu => stu.Name == "张三1");
Console.WriteLine(stu1.Id);
Console.WriteLine(stu2.Id);
IndexOf(), LastIndexOf(), FindIndex(), FindLastIndex()
int index1 = student1.IndexOf(one);//0
int index2 = student1.IndexOf(new Student() { Id = 1, Name = "张三1" });//-1
int index3 = student1.FindIndex(stu => stu.Id == 2);
Console.WriteLine(index1); // 0
Console.WriteLine(index2); // -1
Console.WriteLine(index3); // 1
student1.Add(new Student() { Id = 3, Name = "李四" });
student1.AddRange(
new Student[]
{
new Student(){ Id = 4, Name = "李四1"},
new Student(){ Id = 5, Name = "李四2"},
});
student1.Sort(new ListCompare());
student1.ForEach(student =>
{
Console.WriteLine(student);
});
//编号:3,名称:李四
//编号:4,名称:李四1
//编号:5,名称:李四2
//编号:1,名称:张三1
//编号:2,名称:张三1
//编号:3,名称:张三2
List
的一些关键特性和用法:类型安全:List
是泛型集合,只能存储类型为 T
的元素。这提供了编译时类型检查,避免了运行时的类型转换错误。
动态数组:List
可以根据需要自动调整其大小,就像 ArrayList
一样。但是,由于类型安全,List
提供了更好的性能。
快速索引访问:由于 List
是基于数组实现的,它提供了快速的索引访问能力。
添加和删除元素:List
提供了 Add
、AddRange
、Insert
、Remove
和 RemoveAt
等方法来添加和删除元素。
查找元素:可以使用 IndexOf
、Contains
和 Find
等方法来查找元素。
排序:List
提供了 Sort
方法,可以对集合中的元素进行排序。也可以使用 Sort
方法的重载版本,传入自定义的比较器。
反转:List
的 Reverse
方法可以反转列表中元素的顺序。
复制:可以使用 CopyTo
方法将 List
中的元素复制到数组中。
容量和计数:List
有一个 Capacity
属性,表示可以存储的最大元素数,以及一个 Count
属性,表示当前存储的元素数。
枚举器:List
可以被 foreach
循环直接遍历。
线程安全:List
不是线程安全的。如果需要在多线程环境中使用,可以使用 List
的线程安全版本,如 ConcurrentBag
或者使用锁来同步访问。
internal class Program
{
static void Main()
{
List numbers = new List();
// 添加元素
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);
// 访问元素
Console.WriteLine(numbers[1]); // 输出 20
// 删除元素
numbers.Remove(20);
// 显示元素
foreach (var number in numbers)
{
Console.WriteLine(number);
}
// 获取元素数量
Console.WriteLine("Count: " + numbers.Count);
// 获取最大容量
Console.WriteLine("Capacity: " + numbers.Capacity);
// 排序
numbers.Sort();
// 反转
numbers.Reverse();
}
}