关于c#:.Net中是否有“Set”数据结构?

Is there a “Set” data structure in .Net?

理想情况下,我正在寻找一个模板化的逻辑集类。它将具有所有的标准集操作,如并集、交集等,并折叠重复项。

我最终创建了自己的基于C字典<>的集合类——只使用键。


我想,你能得到的最接近的就是HashSet


我所看到的最佳集合实现是出色的Wintelect功能集合的一部分:http://www.codeplex.com/powercollections。

集合实现可以在这里找到:
http://www.codeplex.com/powercollections/sourcecontrol/fileview.aspx?itemID=101886&;changesetID=6259
它具有所有预期的集合操作(联合、相交等)。

希望这有帮助!


不,框架中没有一个本机的。大多数项目都使用一种开源实现(即nhibernate),称为iesi.collections。下面是一篇关于它的代码项目文章:

http://www.codeproject.com/kb/recipes/sets.aspx


你检查过3.5中的哈希集了吗?


我不认为C有任何内置的东西,但是我知道有一些实现在网络上浮动。关于这类事情也有一些好文章:

这是关于高效表示数据结构的系列文章的第6部分。本部分重点介绍用C表示集合。

集合集合的实现集合类的实现集合类的另一个实现

最后…

实际上,我自己也使用这个库作为一年左右以前所做的集实现的基础。


下面是一个简单的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
public sealed class MathSet<T> : HashSet<T>, IEquatable<MathSet<T>>
{
    public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode();

    public bool Equals(MathSet<T> obj) => SetEquals(obj);

    public override bool Equals(object obj) => Equals(obj as MathSet<T>);

    public static bool operator ==(MathSet<T> a, MathSet<T> b) =>
        ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b);

    public static bool operator !=(MathSet<T> a, MathSet<T> b) => !(a == b);
}

示例用法:

1
2
3
4
5
6
7
8
var a = new MathSet<int> { 1, 2, 3 };
var b = new MathSet<int> { 3, 2, 1 };

var c = a.Equals(b);                        // true

var d = new MathSet<MathSet<int>> { a, b }; // contains one element

var e = a == b;                             // true

请参阅这个问题,了解为什么这种方法会被考虑超过HashSet