.Net中是否有“Set”数据结构?

时间:2008-08-13 23:03:42

标签: c# data-structures set

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

我最终根据C#Dictionary<>创建了自己的set类 - 只使用了键。

6 个答案:

答案 0 :(得分:42)

我认为

HashSet<T>是你最接近的。

答案 1 :(得分:15)

我见过的最好的设置实现是Wintellect的精彩集合的一部分: http://www.codeplex.com/PowerCollections

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

希望这有帮助!

答案 2 :(得分:10)

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

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

答案 3 :(得分:9)

您是否在3.5中查看了HashSet

答案 4 :(得分:6)

我认为c#没有任何内置功能,但我知道网上有一些实现。关于这类事情也有一些好文章:

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

An implementation集合集合 集合类的An implementation
集合类的Yet another implementation

最后......

我实际上已经使用this library作为我大约一年前做过的集合实现的基础。

答案 5 :(得分:0)

这是一个简单的实现:

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

请参阅this question了解为何考虑此方法的原因HashSet