NET 4 新增的 SortedSet 类
以下我们来看 .NET 里 HashSet 的一些示例:
示例一 - 测试查找的功能:
var set = new HashSet<char>("我爱编程");
Response.Write(set.Contains('我')); //True
Response.Write(set.Contains('你')); //False
上述示例中,我们能够将字符串,甚至中文字,传入 HashSet<char> 的构造函数,是因为 string 实现了 IEnumerable<char> 接口,而 HastSet 类也实现了 IEnumerable<T>。
示例二 - 测试 HashSet 内置的一些好用方法:
- SymmetricExceptWith: 仅包含该对象或指定集合中存在的元素(但不可同时包含两者中的元素)。
- UnionWith: 包含该对象本身和指定集合中存在的所有元素。
- ExceptWith: 从当前 HashSet<T> 对象中移除指定集合中的所有元素。
- IntersectWith: 仅包含该对象和指定集合中存在的元素。
using System;
using System.Collections.Generic;
class HashSetDemo
{
static void Main()
{
HashSet<char> setA = new HashSet<char>();
HashSet<char> setB = new HashSet<char>();
setA.Add('A');
setA.Add('B');
setA.Add('C');
setB.Add('C');
setB.Add('D');
setB.Add('E');
Show("Initial content of setA: ", setA);
Show("Initial content of setB: ", setB);
setA.SymmetricExceptWith(setB); //把 setA、setB 各自特有、对方没有的元素列出来
Show("setA after Symmetric difference with SetB: ", setA);
setA.UnionWith(setB); //把 setA、setB 的全部元素列出来 (union 并集)
Show("setA after union with setB: ", setA);
setA.ExceptWith(setB); //把 setA 中,所拥有的 setB 元素移除
Show("setA after subtracting setB: ", setA);
Console.WriteLine();
Console.Read();
}
static void Show(string msg, HashSet<char> set)
{
Console.Write(msg);
foreach (char ch in set)
Console.Write(ch + " ");
Console.WriteLine();
}
}
执行结果:
图 3 测试 SymmetricExceptWith、UnionWith、ExceptWith 方法
setA.IntersectWith(setB); //把 setA 中,所拥有的 setB 元素列出
Show("setA after intersect with setB: ", setA);
执行结果:
图 4 测试 IntersectWith 方法
由于 HastSet<T> 实现了 IEnumerable<T> 接口,因此我们可把其他任何 set 当作参数,传入其他 set 类的运算方法里。
此外,LINQ 也有类似上述示例的 Intersect、Except、Union、Distinct 的 set 运算功能,有兴趣比较两者特性的网友,可参考 msdn 或网络上的文章 [5]。主要的差别在于,LINQ set 运算始终返回新的 IEnumerable<T> 集合,而 HashSet<T> 是修改当前的集合,且 HashSet 提供了比较多的 set 相关算符。
------------------------------------------------------------------------
到了 .NET 4 才新建的 SortedSet 类,除了有前述 HashSet 类所拥有的 SymmetricExceptWith、UnionWith、ExceptWith、IntersectWith 等好用的方法外,还有「GetViewBetween (制定范围)」、「Max (取最大值)」、「Min (取最小值)」等新增的好用方法。
以下我们来看 SortedSet 这三个方法的示例:
示例三 - 测试 GetViewBetween、Max、Min 方法:
using System;
using System.Collections.Generic;
using System.Linq; //此为 Max()、Min() 方法的必要引用
var set = new SortedSet<int>() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };
foreach (int element in set)
Response.Write(string.Format(" {0}", element));
Response.Write("<p>");
Response.Write("Max: " + set.Max() + "<br>");
Response.Write("Min: " + set.Min() + "<br>");
Response.Write("<br>取 2 ~ 5 之间的值: <br>");
//只取值为 2 ~ 5 之间的元素
var subSet = set.GetViewBetween(2, 5);
foreach (int i in subSet)
{
Response.Write(i + ",");
}
执行结果:
图 5 测试 SortedSet 类专属的 GetViewBetween、Max、Min 方法
