【C# 基础】8.ArrayList、List、Dictionary
目录
3、Contains()、IndexOf()、Remove()
4、Insert()、InsertRange()、Clear()
一、ArrayList
了解:
(1)ArrayList实现了IList, ICollection, IEnumerable, ICloneable接口
(2)IList:List列表,主要负责集合的插入,添加,删除,取索引,判断是否包含某个项等操作。
(3)Collection:Collection集合。主要负责集合中的项的个数,集合的复制,拷贝等。
(4)IEnumerable:Enumerable可枚举的, 可数的。主要实现迭代器,实现此接口类都可以被循环,被遍历,被迭代,被枚举
(5)ICloneable:Cloneable克隆。主要负责集合的克隆(复制,拷贝),了解和ICollection接口中CopyTo()的区别:https://blog.csdn.net/yao_hou/article/details/134484811
区别 :
(1)ArrayList定义完之后数组的长度可以动态添加 int[]一旦定义完之后 长度是固定的,
(2) ArrayList存储的是对象类型 int[]数组只能存储相同类型的数据
(3)ArrayList存取数据出现装箱、拆箱操作 int[] 不用装箱和拆箱
(4)ArrayList存储数据类型不安全 int[]数据类型安全(5)ArrayList直接继承object int[] 继承于Array 继承于Object
1、Add()
ArrayList list1= new ArrayList(); //创建一个动态集合对象
//添加元素 把1转成对象类型之后 再添加到动态集合里面,
//把值类型转成引用类型的过程,就是装箱操作
list1.Add(1);
list1.Add(2);
list1.Add(3);
2、AddRange()
// AddRange() 添加一个范围 可以添加一个数组类型的数据. 也可以添加一个集合类型数据
int[] ages = new int[] {1,2,3,4,5};
ArrayList list = new ArrayList() { 1, 2, 3, true, "ss", new object() };
ArrayList list1= new ArrayList(); //创建一个动态集合对象
list1.AddRange(ages);
list1.AddRange(list);
3、Contains()、IndexOf()、Remove()
ArrayList list1= new ArrayList(); //创建一个动态集合对象
//4 Contains 是否包含某个元素
Console.WriteLine(list1.Contains(1));//true
//5 IndexOf() 获取某个元素的索引值
Console.WriteLine(list1.IndexOf(1));
// 6 remove() 移除指定元素
list1.Remove(1);
4、Insert()、InsertRange()、Clear()
//8 Insert()在指定位置添加一个元素
list1.Insert(0, "李四");
//在指定位置添加一个范围数据
list1.InsertRange(2,ages);
//9清空集合
list1.Clear();
5、LastIndexOf()、Reverse()
//LastIndexOf 找索引值 从后往前找
Console.WriteLine(list1.LastIndexOf("李四"));
// 颠倒数组的元素
// list1.Reverse();
6、遍历
// for遍历
// list1.Count 集合数据个数
for (int i = 0; i < list1.Count; i++)
{
Console.WriteLine(list1[i]);
}
foreach (var item in list1)
{
Console.WriteLine(item+"------");
}
二、List
在C#中,List<T>是一种非常常用的泛型集合类,用于存储一组相同类型的元素。List<T>具有动态调整大小的能力,可以方便地添加、删除、查找和修改元素,非常灵活和高效
1、创建List<T>对象
// 创建一个整数列表
List<int> list = new List<int>();
List<int> list = {1,2,3,4,5};
// 创建一个字符串列表
List<string> list = new List<string>();
2、添加元素
List<T>提供了多个方法用于添加元素到列表中,最常用的是Add()方法。
List<string> fruitsList = new List<string>();
// 添加元素到列表
fruitsList.Add("apple");
fruitsList.Add("orange");
fruitsList.Add("banana");
3、删除元素
List<T>提供了多个方法用于删除元素,常用的有Remove()、RemoveAt()和Clear()方法。
1.Remove()方法
Remove()方法用于从列表中删除指定元素。如果列表中存在多个相同的元素,只会删除第一个匹配的元素。
List<string> fruitsList = new List<string> { "apple", "orange", "banana" };
fruitsList.Remove("orange"); // 从列表中删除元素"orange"
在上述代码中,Remove("orange")会删除列表fruitsList中的第一个元素"orange"。
2.RemoveAt()方法
RemoveAt()方法用于根据索引从列表中删除元素。
List<string> fruitsList = new List<string> { "apple", "orange", "banana" };
fruitsList.RemoveAt(1); // 从列表中删除索引为1的元素,即"orange"
在上述代码中,RemoveAt(1)会删除列表fruitsList中索引为1的元素"orange"。
3.Clear()方法
Clear()方法用于清空整个列表,即删除所有元素。
List<string> fruitsList = new List<string> { "apple", "orange", "banana" };
fruitsList.Clear(); // 清空列表
在上述代码中,Clear()会将列表fruitsList中的所有元素全部删除,列表变为空。
4、查找元素
List<T>提供了多个方法用于查找元素,常用的有Contains()和IndexOf()方法。
1.Contains()方法
Contains()方法用于判断列表中是否包含指定元素,返回一个布尔值。
List<string> fruitsList = new List<string> { "apple", "orange", "banana" };
bool isContains = fruitsList.Contains("orange"); // 判断列表是否包含元素"orange"
在上述代码中,isContains将会被赋值为true,因为列表fruitsList中包含元素"orange"。
2.IndexOf()方法
IndexOf()方法用于查找指定元素在列表中的索引,如果列表中存在多个相同的元素,只返回第一个匹配的元素索引。
List<string> fruitsList = new List<string> { "apple", "orange", "banana" };
int index = fruitsList.IndexOf("orange"); // 查找元素"orange"的索引
在上述代码中,index将会被赋值为1,表示元素"orange"在列表fruitsList中的索引为1。
5、遍历List<T>
可以使用循环结构(如for、foreach)遍历List<T>中的所有元素。
1.使用for循环遍历
List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
// 使用for循环遍历列表
for (int i = 0; i < numbersList.Count; i++)
{
Console.WriteLine(numbersList[i]);
}
2.使用foreach循环遍历
List<int> numbersList = new List<int> { 1, 2, 3, 4, 5 };
// 使用foreach循环遍历列表
foreach (int number in numbersList)
{
Console.WriteLine(number);
}
在上述代码中,count将会被赋值为5,表示列表numbersList中有5个元素。
3.List.ForEach()
是 List 自带的遍历方法,遍历集合中每一个元素,执行自定义操作。
语法:list.ForEach(元素 => 执行操作);
List<int> list = new List<int> { 10, 20, 30, 40 };
// 方式1:Lambda 最简
list.ForEach(x => Console.WriteLine(x));
//多行操作 {}
//x是元素
List<int> list = new List<int> { 10, 20, 30, 40 };
list.ForEach(x =>
{
Console.WriteLine("数字:" + x);
Console.WriteLine("平方:" + x * x);
});
- ForEach 里面不能用 break、continue
- 遍历中不要增删 List 元素,会报错
- 是 List 专属,数组、Array 没有 ForEach
4. Find()
找到第一个匹配的对象,找不到返回 null。
List<int> list = new List<int> { 10, 20, 30, 40 };
// 找第一个大于20的数
//Find 查找元素对象
//()写的满足条件函数
//x 就是每一个元素
int res = list.Find(x => x > 20);
Console.WriteLine(res); // 输出 30
5.FindIndex()
按条件找索引下标,找不到返回 -1。
//FindIndex 按条件找索引下标,找不到返回 -1
//()写的满足条件函
//x 就是每一个元素
// 找第一个大于30的元素下标
int index = list.FindIndex(x => x > 30);
Console.WriteLine(index); // 2
6、List<T>常用属性及方法
| 属性 | 方法 |
| Count | 用于获取列表中元素的个数 |
| Items | 获取或设置指定索引处的元素 |
| 方法 | 用法 |
| Add() | 在 List<T> 的末尾添加一个元素。 |
| AddRange() | 在 List<T> 的末尾添加指定集合的元素。 |
| Clear() | 从 List<T> 中移除所有元素。 |
| Remove() | 移除指定元素的第一个匹配项。 |
| RemoveAt() | 移除指定索引处的元素。 |
| Contains() | 检查指定元素是否存在于 List<T> 中。 |
| Sort() | 对所有元素进行排序。 |
| IndexOf() | 查找指定元素在列表中的索引。 |
| Reverse() | 逆转List<T>中元素的顺序 |
| Insert() | 在 List<T> 中指定索引处插入元素。 |
| InsertRange() | 在指定索引处插入另一个集合的元素。 |
| Find() | 在List中查找满足特定条件的元素,找不到返回null。 |
| FindIndex() | 按条件找索引下标,找不到返回 -1。 |
三、Dictionary
Dictionary<Key, Value>
- 键值对集合:Key (唯一键) → Value (值)
- Key 不能重复,不能为
null;Value 可以重复,可以为null- 无序存储,查找速度极快(哈希表原理)
- 命名空间:
using System.Collections.Generic;
1、声明 & 创建字典
1. 基础声明
// 键:string ; 值:int
Dictionary<string,int> dic=new Dictionary<string,int>();
2. 初始化赋值
// 方式1:初始化器
Dictionary<string,int> dic =new Dictionary<string,int>(){
{"语文",90},
{"数学",85 },
};
// 方式2:简写(C# 6.0+)
Dictionary<string, int> dic2 = new Dictionary<string, int>()
{
["语文"]=90,
["数学"]=80
};
2、常用增删改查
1. 添加元素 Add()
Dictionary<string, int> dic = new Dictionary<string, int>();
// 添加键值对
dic.Add("张三", 88);
dic.Add("李四", 76);
⚠️ 注意:添加重复 Key 直接报错
2. 索引器添加 / 修改(推荐)
// 不存在则新增,存在则覆盖修改
dic["王五"] = 92;
dic["张三"] = 95; // 覆盖原来张三的分数
3. 安全添加(不报错)
// 键不存在才添加,存在不做任何操作
dic.TryAdd("赵六", 80);
4. 查找取值
// 方式1:索引器,键不存在直接报错
int score = dic["张三"];
// 方式2:TryGetValue 安全取值(推荐)
if (dic.TryGetValue("张三", out int s))
{
Console.WriteLine("分数:" + s);
}
else
{
Console.WriteLine("不存在该学生");
}
5. 判断是否包含键 / 值
// 是否包含某个键
bool hasKey = dic.ContainsKey("张三");
// 是否包含某个值
bool hasValue = dic.ContainsValue(88);
6. 删除元素
// 根据 Key 删除
dic.Remove("李四");
// 清空所有元素
dic.Clear();
3、遍历字典 3 种方式
1:遍历 KeyValuePair
foreach (KeyValuePair<string, int> item in dic)
{
Console.WriteLine($"姓名:{item.Key},分数:{item.Value}");
}
2:只遍历所有 Key
foreach (string key in dic.Keys)
{
Console.WriteLine(key + " → " + dic[key]);
}
3:只遍历所有 Value
foreach (int val in dic.Values)
{
Console.WriteLine("分数:" + val);
}
4、字典常用属性
// 获取元素个数
int count = dic.Count;
// 所有键集合
var keys = dic.Keys;
// 所有值集合
var values = dic.Values;
5、常见易错点
- Key 不能重复:Add 重复添加,Key 抛异常;索引器添加,直接覆盖
- Key 不能为 null,Value 可以为 null
- 不要用 foreach 遍历字典时增删元素,会报错
- 取值优先用
TryGetValue,避免键不存在程序崩溃
6、字典存自定义类(实操)
1、比如存 Student 学生对象:
class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
使用字典:Key 存学号,Value 存学生对象
// 键:学号string,值:Student对象
Dictionary<string, Student> stuDic = new Dictionary<string, Student>();
// 添加
stuDic["001"] = new Student { Name = "张三", Score = 85 };
stuDic["002"] = new Student { Name = "李四", Score = 92 };
// 取值
var s = stuDic["001"];
Console.WriteLine(s.Name + " " + s.Score);
// 遍历
foreach (var item in stuDic)
{
Console.WriteLine($"学号{item.Key} 姓名{item.Value.Name} 分数{item.Value.Score}");
}
2、统计一个字符串每个字符串符出现的次数,以及谁的次数最多,要求使用字典?
string s1 = "aasdfghjklasdfghj";
Dictionary<char,int> dic= new Dictionary<char,int>();
for (int i = 0; i < s1.Length; i++) {
if (!dic.ContainsKey(s1[i])) dic[s1[i]] = 1;
else dic[s1[i]]++;
}
foreach (var item in dic) {
Console.WriteLine(item.Key+":"+item.Value);
}
char maxElement = ' ';
int maxCount = 0;
foreach (var item in dic) {
if (maxCount < item.Value) {
maxCount=item.Value;
maxElement = item.Key;
}
}
foreach (var item in dic)
{
if (item.Value == maxCount) {
Console.WriteLine(item.Key+":"+item.Value);
}
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)