56

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

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

4

6 回答 6

49

HashSet<T>大概是你能得到的最接近的,我想。

于 2008-08-13T23:05:20.457 回答
15

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

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

希望这可以帮助!

于 2008-08-13T23:44:59.063 回答
10

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

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

于 2008-08-13T23:08:53.973 回答
10

你检查过 3.5中的HashSet吗?

于 2008-10-14T04:05:00.453 回答
6

我不认为 c# 有任何内置的东西,但我知道网上有几个实现。也有一些关于这类事情的好文章:

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

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

最后...

实际上,我自己使用这个库作为我大约一年前所做的一组实现的基础。

于 2008-08-13T23:17:00.557 回答
1

这是一个简单的实现:

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

于 2018-05-10T01:51:59.153 回答