关于 .NET 4.0 SortedSet 集合的介绍






3.15/5 (29投票s)
本文将介绍使用 SortedSet 的一些好处。
引言
.NET 4.0 包含了一个新的对象集合,它会将元素列表保持为排序顺序。

它位于 **System Assembly** 中,属于 **System.Collections.Generic
命名空间**。
内部概览
SortedSet
实现了多种接口

以下是其中一些接口的简要介绍
ISet<T >
提供集合抽象的基接口。
IDeserializationCallback
指示类将在整个对象图反序列化完成后收到通知。
Using the Code
让我们来看一些示例,了解我们可以用这个新朋友做什么。
示例 1:显示元素

考虑这个简单的程序。
我们创建了一个类型为 integer
的新 SortedSet
,并为其分配了一些随机值。其中数字 100
出现了两次。
运行程序得到

可以推断出,重复的元素已被移除,并且进行了排序。
接下来考虑这个

名字 Niladri 出现了三次,其中一次是全大写。
运行后,我们得到

可以推断出,它移除了大小写相同的 Niladri,但没有移除大写的那个。
示例 2:GetViewBetween
此方法会生成一个只包含指定范围内的值的子集视图。
假设我们想查看 **A 到 C** 之间的元素。
stringElementSet.GetViewBetween("A","C").ToList().ForEach(i => Console.WriteLine(i));
输出如预期:
Arina
Biswas
示例 3:添加新元素
我们可以使用 Add
方法向排序列表中添加元素。它会返回 true
或 false
,取决于元素是否已成功添加。
例如:

我们的列表中已经有一个名为 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);
输出

2) 第二个重载方法
public void CopyTo(T[] array, int index);
目的:将完整的 System.Collections.Generic.SortedSet
复制到一个兼容的一维数组中,从指定的数组索引开始。例如:
string[] arr = new string[stringElementSet.Count + 1];
stringElementSet.CopyTo(arr,1);

由于复制操作从第 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
中选取前两个元素。
输出如预期:

示例 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));
...得到以下输出

B) UnionWith
修改当前的 SortedSet
对象,使其包含当前对象和指定集合中存在的所有元素。
stringElementSet
.UnionWith(stringSecondElementSet);
stringElementSet
.ToList()
.ForEach(i => Console.WriteLine(i));
输出

示例 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
的方法。希望对您有所帮助。
非常感谢您对该主题的评论,以便改进该主题。
感谢阅读本文。