В идеале, я ищу шаблонный логический класс Set. Он должен иметь все стандартные операции над множествами, такие как объединение, пересечение и т.д., и уничтожать дублирующиеся элементы.
В итоге я создал свой собственный класс множеств на основе C# Dictionary<>- просто используя ключи.
Лучшее внедрение набора, которое я видел, является частью замечательного Wintellect' s Коллекции Власти: http://www.codeplex.com/PowerCollections.
Внедрение набора может быть найдено here:< br/> [http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx? itemId=101886& changeSetId=6259] [2] < br/> Это начинает все ожидаемые операции по набору (союз, пересекитесь, и т.д.).
Надежда это помогает!
[2]: http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx? itemId=101886& changeSetId=6259
Нет, во фреймворке нет такой возможности. Существует реализация с открытым исходным кодом, которую использует большинство проектов (т.е. nHibernate) под названием Iesi.Collections. Вот статья CodeProject о ней:
Я не думаю, что в c# есть что-то встроенное, но я знаю, что в сети есть несколько реализаций. Есть также несколько хороших статей на эту тему:
Это часть 6 из серии статей об эффективном представлении структуры данных. Эта часть посвящена представлению множеств в C#.
Реализация коллекции множеств
Реализация класса множеств
Еще одна реализация класса множества
И наконец...
Я сам использовал эту библиотеку в качестве основы для реализации множества, которую я сделал год или около того назад.
Here' s простое внедрение:
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'.