Is there a "Set" data structure in .Net?

C#Data StructuresSet

C# Problem Overview


Ideally, I'm looking for a templated logical Set class. It would have all of the standard set operations such as Union, Intersection, Etc., and collapse duplicated items.

I ended up creating my own set class based on the C# Dictionary<>- just using the Keys.

C# Solutions


Solution 1 - C#

HashSet<T> is about the closest you'll get, I think.

Solution 2 - C#

The best set implementation I have seen is part of the wonderful Wintellect's Power Collections: http://www.codeplex.com/PowerCollections.

The set implementation can be found here:
http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259
It has all the expected set operations (union, intersect, etc).

Hope this helps!

Solution 3 - C#

No, there is not one natively in the framework. There is an open source implementation that most projects use, (i.e. nHibernate) called Iesi.Collections. Here's a CodeProject article about it:

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

Solution 4 - C#

Have you checked out the HashSet in 3.5?

Solution 5 - C#

I don't think c# has anything built in, but I know there are a couple of implementations floating around on the net. There are also some good articles around on this sort of thing:

This is part 6 of a series on efficiently representing data structure. This part focuses on representing sets in C#.

An implementation of a set collection
An implementation of a set class
Yet another implementation of a set class

And finally...

I've actually used this library myself as the basis of a set implementation that I did a year or so ago.

Solution 6 - C#

Here's a simple implementation:

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);
}

Example usage:

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

See this question for why this approach was considered over HashSet.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBlinkyView Question on Stackoverflow
Solution 1 - C#Matt HamiltonView Answer on Stackoverflow
Solution 2 - C#Brad LeachView Answer on Stackoverflow
Solution 3 - C#Dale RaganView Answer on Stackoverflow
Solution 4 - C#Stephen franklinView Answer on Stackoverflow
Solution 5 - C#lomaxxView Answer on Stackoverflow
Solution 6 - C#dharmatechView Answer on Stackoverflow