理想情况下,我正在寻找一个模板化的逻辑 Set 类。它将具有所有标准集合操作,例如 Union、Intersection 等,并折叠重复项。
我最终基于 C# Dictionary<> 创建了我自己的集合类 - 仅使用键。
理想情况下,我正在寻找一个模板化的逻辑 Set 类。它将具有所有标准集合操作,例如 Union、Intersection 等,并折叠重复项。
我最终基于 C# Dictionary<> 创建了我自己的集合类 - 仅使用键。
HashSet<T>
大概是你能得到的最接近的,我想。
我见过的最好的集合实现是精彩的 Wintellect 的 Power Collections 的一部分:http: //www.codeplex.com/PowerCollections。
集合实现可以在这里找到: http:
//www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886
&changeSetId=6259
它具有所有预期的集合操作(联合、相交等)。
希望这可以帮助!
不,框架中没有原生的。大多数项目都使用一个开源实现(即 nHibernate),称为 Iesi.Collections。这是一篇关于它的 CodeProject 文章:
你检查过 3.5中的HashSet吗?
我不认为 c# 有任何内置的东西,但我知道网上有几个实现。也有一些关于这类事情的好文章:
这是关于有效表示数据结构的系列文章的第 6 部分。本部分重点介绍用 C# 表示集合。
集合
的实现 集合类的实现集合类的另一个
实现
最后...
实际上,我自己使用这个库作为我大约一年前所做的一组实现的基础。
这是一个简单的实现:
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
。