Skip to Content

集合(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 False

IsSubsetOf / 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 遍历 3

ToList() 把集合拷贝成列表,之后的增删与集合无关。for-in 直接遍历元素。遍历顺序没有保证,需要稳定顺序就先 ToList()。

注意

  • 打印形式与列表一样是方括号:[甲, 乙]。
  • 集合元素无下标概念,需要按位置访问就先 ToList()。
  • 元素按「可判等」口径去重与哈希,全语言判等二分见判等与哈希。
最后更新于 2026年10月10日