理想情况下,我正在寻找模板化的逻辑Set类。它将具有所有标准的集合操作,例如Union,Intersection等,以及折叠重复的项目。
我最终根据C#Dictionary<>创建了自己的set类 - 只使用了键。
答案 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文章:
答案 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
。