NET中是否有“设置”数据结构?

理想情况下,我正在寻找模板化的逻辑Set类。 它将具有所有标准设置操作,例如联合,相交,等等,以及折叠重复项。

我最终仅使用键就基于C#Dictionary <>创建了自己的集合类。

Chris asked 2020-02-13T18:56:34Z
6个解决方案
44 votes

我认为HashSet<T>是最接近的解决方案。

Matt Hamilton answered 2020-02-13T18:56:47Z
15 votes

我见过的最好的设置实现是精彩的Wintellect的Power Collections的一部分:[http://www.codeplex.com/PowerCollections。]

集合的实现可以在这里找到:
[http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259]
它具有所有预期的设置操作(联合,相交等)。

希望这可以帮助!

Brad Leach answered 2020-02-13T18:57:24Z
10 votes

不,框架本身没有一个。 大多数项目都使用一个名为Iesi.Collections的开源实现(即nHibernate)。 这是关于它的CodeProject文章:

[http://www.codeproject.com/KB/recipes/sets.aspx]

Dale Ragan answered 2020-02-13T18:57:49Z
9 votes

您是否已在3.5中签出HashSet?

Stephen franklin answered 2020-02-13T18:58:09Z
6 votes

我不认为c#内置任何东西,但是我知道网上有很多实现。 关于这种事情,也有一些不错的文章:

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

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

最后...

实际上,我本人实际上已经将该库用作一年前左右执行的集合实现的基础。

lomaxx answered 2020-02-13T18:58:56Z
0 votes

这是一个简单的实现:

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

用法示例:

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中考虑使用此方法的信息,请参见此问题。

dharmatech answered 2020-02-13T18:59:24Z
translate from https://stackoverflow.com:/questions/10458/is-there-a-set-data-structure-in-net