Есть ли в .Net структура данных «Set»?

В идеале я ищу шаблонный логический класс Set. Он будет иметь все стандартные операции над множествами, такие как объединение, пересечение и т. Д., И свертывать дублирующиеся элементы.

Я закончил тем, что создал свой собственный набор классов на основе C # Dictionary <> - просто используя ключи.

13.08.2008 23:03:42
@ d03boy: Ну, теперь у него есть HashSet <T>, но после его использования я думаю, что интерфейс действительно отстой.
Skurmedel 1.03.2010 11:49:05
.NET 4 имеет интерфейс ISet вместе с двумя реализациями, HashSet и SortedSet
Eric Hauser 29.06.2010 04:09:08
Смотрите этот вопрос для простой реализации набора.
dharmatech 10.05.2018 01:50:21
Возможный дубликат коллекции C # Set?
dharmatech 10.05.2018 04:06:42
6 ОТВЕТОВ

HashSet<T> Я думаю, это самое близкое, что вы получите.

46
11.03.2018 01:15:49
Мэтт, +1. Это звучит как то, что он просил. Похоже, что это было добавлено спустя много времени после написания статьи.
Derek Park 13.08.2008 23:16:33

Нет, в структуре нет ни одного. Существует реализация с открытым исходным кодом, которую использует большинство проектов (т.е. nHibernate), которая называется Iesi.Collections. Вот статья CodeProject об этом:

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

10
13.08.2008 23:12:22

Я не думаю, что в c # есть что-то встроенное, но я знаю, что в сети есть несколько реализаций. Есть также несколько хороших статей об этом:

Это часть 6 серии по эффективному представлению структуры данных. Эта часть посвящена представлению множеств в C #.

Реализация набора множеств
. Реализация класса множеств.
Еще одна реализация класса множеств.

И наконец...

На самом деле я сам использовал эту библиотеку в качестве основы для реализации набора, которую я сделал год или около того назад.

6
13.08.2008 23:17:00

Лучшая реализация набора, которую я видел, является частью замечательной коллекции электропитания Wintellect: http://www.codeplex.com/PowerCollections .

Реализация набора может быть найдена здесь:
http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259.
Здесь есть все ожидаемые операции над множествами (объединение, пересечение и т. Д.).

Надеюсь это поможет!

15
13.08.2008 23:44:59

Вы проверили HashSet в 3.5?

9
24.11.2008 05:30:51

Вот простая реализация:

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.

0
10.05.2018 01:51:59