集合(Set)
set<T> 是内部元素不重复的容器,同一元素只存一份。
创建与去重
val s: set<string> = ["甲", "乙", "甲"];
print(s, s.Count);
s.Add("甲");
print(s.Contains("甲"), s.Contains("丙"), s.Count);
s.Remove("乙");
print(s);[甲, 乙] 2
True False 2
[甲]集合字面量按目标类型构造:写了三份,进集合只剩两份。Contains 走哈希判定,Remove 则是按值删。
无注解的 [1, 2] 默认推断为数组,想要集合必须显式注解 set<T>。传参位同理,形参是 set<T> 时调用侧可以直接写字面量。
集合运算
val b: set<int> = [3, 4];
val u: set<int> = [1];
u.UnionWith(b);
print(u);
val i: set<int> = [1, 3];
i.IntersectWith(b);
print(i);
val e: set<int> = [1, 3];
e.ExceptWith(b);
print(e);[1, 3, 4]
[3]
[1]四个方法都是原地修改接收者:UnionWith 并入、IntersectWith 保留交集、ExceptWith 剔除交集、SymmetricExcept(other) 原地换成对称差(只在一方出现的元素):
val s: set<int> = [1, 2, 3];
val b: set<int> = [3, 4];
s.SymmetricExcept(b);
print(s);[1, 2, 4]关系判断
val a: set<int> = [1, 2, 3];
val b: set<int> = [3, 4];
print(a.IsSubsetOf(b), a.SetEquals(b));False FalseIsSubsetOf / IsSupersetOf 判包含关系,SetEquals 判元素完全一致。均为只读判断,不修改任一操作数。
转换与遍历
val a: set<int> = [1, 2, 3];
val l = a.ToList();
l.Add(9);
print(l);
for x in a
{
print("遍历", x);
}[1, 2, 3, 9]
遍历 1
遍历 2
遍历 3ToList() 把集合拷贝成列表,之后的增删与集合无关。for-in 直接遍历元素。遍历顺序没有保证,需要稳定顺序就先 ToList()。
注意
- 打印形式与列表一样是方括号:
[甲, 乙]。 - 集合元素无下标概念,需要按位置访问就先
ToList()。 - 元素按「可判等」口径去重与哈希,全语言判等二分见判等与哈希。
最后更新于 2026年10月10日
