第三十七式:C# 集合 (兵器库)

绝世
秘籍
冲儿,之前的数组(Array)虽然好用,但它有个死穴:长度是固定的。
如果你想把战利品源源不断地塞进口袋,数组就不够用了。
这时候,你需要集合 (Collections)。它们就像乾坤袋,能大能小,随心所欲。
是不是像丐帮的口袋一样,什么都能装?

1. ArrayList - 丐帮口袋

这是最古老的集合,什么都能装(int, string, object...),但也最不安全。


using System.Collections;

ArrayList bag = new ArrayList();
bag.Add("打狗棒"); // 装字符串
bag.Add(100);      // 装整数(这不安全!)

// 取出来的时候,必须强制转换
string weapon = (string)bag[0];
        

2. List<T> - 专属剑匣

这是现在的江湖主流(泛型集合)。它规定了只能装特定类型的东西。


using System.Collections.Generic;

// 这是一个只装字符串的列表
List swords = new List();

swords.Add("倚天剑");
swords.Add("屠龙刀");
// swords.Add(123); // 报错!这里不能放数字,岳长老会拦住你。

// 它是动态的!
Console.WriteLine(swords.Count); // 2
swords.Remove("屠龙刀"); // 扔掉一把
Console.WriteLine(swords.Count); // 1
        

3. Dictionary<K, V> - 藏宝图

键值对(Key-Value)。通过一个线索(Key)找到宝藏(Value)。


Dictionary power = new Dictionary();

power.Add("令狐冲", 95);
power.Add("东方不败", 100);

Console.WriteLine(power["令狐冲"]); // 95
        
现在已经没人用 ArrayList 了,因为它性能差(涉及装箱拆箱)且不安全。
请务必使用 List<T>Dictionary<K, V>,它们在 System.Collections.Generic 命名空间下。
🎒

动手时刻:点兵点将

创建一个 List<string>,把“风清扬”、“令狐冲”、“任盈盈”加进去。

然后遍历这个列表,如果名字包含“令”,就把它从列表中移除。

(提示:在遍历时移除元素是危险动作,最好用倒序遍历,或者用 RemoveAll

查看参考答案

List heros = new List { "风清扬", "令狐冲", "任盈盈" };

// 方法一:高手招式
heros.RemoveAll(name => name.Contains("令"));

// 方法二:笨办法(倒序循环)
// for (int i = heros.Count - 1; i >= 0; i--)
// {
//     if (heros[i].Contains("令")) heros.RemoveAt(i);
// }

foreach (var h in heros) Console.WriteLine(h);
                    

成就解锁:【军需官】 获得:乾坤袋