65.9K
CodeProject 正在变化。 阅读更多。
Home

关于 .NET 4.0 SortedSet 集合的介绍

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.15/5 (29投票s)

2010年10月26日

CPOL

4分钟阅读

viewsIcon

49520

downloadIcon

126

本文将介绍使用 SortedSet 的一些好处。

引言

.NET 4.0 包含了一个新的对象集合,它会将元素列表保持为排序顺序。

1.jpg

它位于 **System Assembly** 中,属于 **System.Collections.Generic 命名空间**。

内部概览

SortedSet 实现了多种接口

2.jpg

以下是其中一些接口的简要介绍

ISet<T >

提供集合抽象的基接口。

IDeserializationCallback

指示类将在整个对象图反序列化完成后收到通知。

Using the Code

让我们来看一些示例,了解我们可以用这个新朋友做什么。

示例 1:显示元素

3.jpg

考虑这个简单的程序。

我们创建了一个类型为 integer 的新 SortedSet ,并为其分配了一些随机值。其中数字 100 出现了两次。

运行程序得到

4.jpg

可以推断出,重复的元素已被移除,并且进行了排序。

接下来考虑这个

5.jpg

名字 Niladri 出现了三次,其中一次是全大写。

运行后,我们得到

6.jpg

可以推断出,它移除了大小写相同的 Niladri,但没有移除大写的那个。

示例 2:GetViewBetween

此方法会生成一个只包含指定范围内的值的子集视图。

假设我们想查看 **A 到 C** 之间的元素。

stringElementSet.GetViewBetween("A","C").ToList().ForEach(i => Console.WriteLine(i));

输出如预期:

Arina
Biswas

示例 3:添加新元素

我们可以使用 Add 方法向排序列表中添加元素。它会返回 true false ,取决于元素是否已成功添加。

例如:

7.jpg

我们的列表中已经有一个名为 Arina 的元素,因此 Add 方法返回 false ,因为我们在第一个示例中已经看到,SortedSet 会移除重复元素然后排序。因此,结果 False 是完全符合预期的。

但是,如果我们添加 Arina Biswas,它将成功添加。

示例 4:移除一个元素/多个元素

SortedList 提供了两种移除元素的方法

a) public bool Remove(T item);

System.Collections.Generic.SortedSet<t> 中移除指定的项。例如:

stringElementSet.Remove("Niladri");

b) public int RemoveWhere(Predicate<T> match);

System.Collections.Generic.SortedSet<T> 中移除所有符合指定谓词定义的条件的元素。例如:

stringElementSet.RemoveWhere(i => i.StartsWith("N"));

可以看出,我们正在从集合中移除名字以 N 开头的名字。

示例 5:Overlaps

这是一个非常方便的方法,用于判断当前的 System.Collections.Generic.SortedSet 对象和指定的集合是否共享共同的元素。例如:

var stringDifferentElementSet = new SortedSet { "SomeotherElements" };
bool res = stringElementSet.Overlaps(stringDifferentElementSet);

将返回 false ,因为没有共同的元素。

但是,如果我们更改集合为

var stringDifferentElementSet = new SortedSet { "SomeotherElements","NILADRI" };

输出将是 true ,因为 NILADRI 是两个集合的共同元素。

示例 6:CopyTo 方法

SortedSet CopyTo 方法将元素复制到一个兼容的一维数组中。

它有三个重载方法。

1) 第一个重载方法
public void CopyTo(T[] array);

目的:将完整的 System.Collections.Generic.SortedSet 复制到一个兼容的一维数组中,从目标数组的开头开始。例如:

string[] arr = new string[stringElementSet.Count];
stringElementSet.CopyTo(arr);

输出

8.jpg
2) 第二个重载方法
public void CopyTo(T[] array, int index);

目的:将完整的 System.Collections.Generic.SortedSet 复制到一个兼容的一维数组中,从指定的数组索引开始。例如:

string[] arr = new string[stringElementSet.Count + 1];
stringElementSet.CopyTo(arr,1);
9.jpg

由于复制操作从第 1 个元素开始,因此第零个索引为零。

3) 第三个重载方法
public void CopyTo(T[] array, int index, int count);

目的:将指定数量的元素从 System.Collections.Generic.SortedSet 复制到一个兼容的一维数组中,从指定的数组索引开始。例如:

string[] arr = new string[stringElementSet.Count];
stringElementSet.CopyTo(arr, 1,2);

在这里,复制操作从第 1 个数组索引开始,我们将从 SortedList 中选取前两个元素。

输出如预期:

10.jpg

示例 7:合并/组合两个 Sorted Sets

A) Union

使用默认的相等比较器生成两个序列的集合并集。

考虑以下两个集合

var stringElementSet = new SortedSet<string> 
	{ "Niladri", "NILADRI", "Arina", "Biswas", "Niladri" };
var stringSecondElementSet = new SortedSet<string> { "0", "1","2","3","4" };

运行以下代码...

stringElementSet.Union(stringSecondElementSet).ToList()
.ForEach(i => Console.WriteLine(i));

...得到以下输出

11.jpg
B) UnionWith

修改当前的 SortedSet 对象,使其包含当前对象和指定集合中存在的所有元素。

stringElementSet
.UnionWith(stringSecondElementSet);

stringElementSet
.ToList()
.ForEach(i => Console.WriteLine(i));

输出

12.jpg2

示例 8:Intersect - 查找共同元素

考虑...

var stringElementSet = new SortedSet<string> { "Niladri", ""Arina", "Biswas};
var stringSecondElementSet = new SortedSet<string> {"Hello", "Niladri" };

...执行一个...

stringElementSet
	.Intersect(stringSecondElementSet)
	.ToList()
	.ForEach(i => Console.WriteLine(i));

...将结果是 Niladri,因为它是一个共同的元素。

示例 9:Except – 两个集合的差集

例如:

stringElementSet
.Except(stringSecondElementSet)
.ToList()
.ForEach(i => Console.WriteLine(i)); 

将得到

Arina and Biswas

但是……

stringSecondElementSet
.Except(stringElementSet)
.ToList()
.ForEach(i => Console.WriteLine(i));

...将得到输出 Hello

示例 10:IntersectWith - 移除两个集合中不共有的所有元素

例如:

stringElementSet.IntersectWith(stringSecondElementSet);

将得到输出 Niladri

示例 11:SymmetricExceptWith – 保留两个集合中独有的元素,并移除共有的元素

例如:

stringElementSet.SymmetricExceptWith(stringSecondElementSet);

将移除 Niladri 并得到输出

Arina
Biswas
Hello

示例 12:Max 和 Min 属性

分别获取列表中的 Max 元素和 Min 元素。例如:

Console.WriteLine("Min element is {0} and Max is {1} "
						,stringElementSet.Min
						,stringElementSet.Max);

将得到输出 “Min element is Arina and Max is NILADRI”

结论

本教程介绍了一些 SortedSet 的方法。希望对您有所帮助。

非常感谢您对该主题的评论,以便改进该主题。

感谢阅读本文。

© . All rights reserved.