技术开发 频道

详解.NET 4的SortedSet类新特性

  以下我们来看 .NET 里 HashSet 的一些示例:

  示例一 - 测试查找的功能:

var set = new HashSet("我爱编程");

  Response.Write(
set.Contains('我')); //True

  Response.Write(
set.Contains('你')); //False

  上述示例中,我们能够将字符串,甚至中文字,传入 HashSet 的构造函数,是因为 string 实现了 IEnumerable 接口,而 HastSet 类也实现了 IEnumerable

  示例二 - 测试 HashSet 内置的一些好用方法:

  SymmetricExceptWith: 仅包含该对象或指定集合中存在的元素(但不可同时包含两者中的元素)。

  UnionWith: 包含该对象本身和指定集合中存在的所有元素。

  ExceptWith: 从当前 HashSet 对象中移除指定集合中的所有元素。

  IntersectWith: 仅包含该对象和指定集合中存在的元素。

using System;

  using System.Collections.Generic;

  class HashSetDemo

  {

  static void Main()

  {

  HashSet setA
= new HashSet();

  HashSet setB
= new HashSet();

  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);

  setA.IntersectWith(setB);
//把 setA 中,所拥有的 setB 元素列出

  Show(
"setA after intersect with setB: ", setA);

  Console.WriteLine();

  Console.Read();

  }

  static void Show(
string msg, HashSet set)

  {

  Console.Write(msg);

  foreach (char ch in
set)

  Console.Write(ch
+ " ");

  Console.WriteLine();

  }

  }

 

  执行结果:

 

  图 3

  由于 HastSet 实现了 IEnumerable 接口,因此我们可把其他任何 set 当作参数,传入其他 set 类的运算方法里。

  此外,LINQ 也有类似上述示例的 Intersect、Except、Union、Distinct 的 set 运算功能,有兴趣比较两者特性的网友,可参考 msdn 或网络上的文章 [5]。主要的差别在于,LINQ set 运算始终返回新的 IEnumerable 集合,而 HashSet 是修改当前的集合,且 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() { 5, 9, 2, 1, 2, 2, 3, 7, 4, 9, 9 };

  foreach (
int element in set)

  Response.Write(
string.Format(" {0}", element));

  Response.Write(
"

");

  Response.Write(
"Max: " + set.Max() + "
"
);

  Response.Write(
"Min: " + set.Min() + "
"
);

  Response.Write(
"
2 ~ 5 之间的值:
");

  
//只取值为 2 ~ 5 之间的元素

  var subSet
= set.GetViewBetween(2, 5);

  foreach (
int i in subSet)

  {

  Response.Write(i
+ ",");

  }

 

    执行结果:

 

  图 4

  此 GetViewBetween() 方法,也适用于 SortedSort 里元素为字符串、字符的处理

0
相关文章