Există o structură de date "Set" în .Net?

În mod ideal, caut o clasă logică șablonată. Ar fi toate operațiile standard stabilite, cum ar fi Union, Intersection, Etc. și colapsul elementelor duplicate.

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

0
fr hi bn
Consultați această întrebare pentru o implementare simplă a unui set.
adăugat autor dharmatech, sursa
Duplicat posibil din Setarea colecției C #?
adăugat autor dharmatech, sursa
@ d03boy: Ei bine, are HashSet acum, dar după ce am folosit un pic cred că interfața este cu adevărat e de rahat.
adăugat autor Skurmedel, sursa
.NET 4 are o interfață ISet, împreună cu două implementări, HashSet și SortedSet
adăugat autor Eric Hauser, sursa
.Net sincer nu are o colecție de seturi? Ce dezamăgire masivă. Un alt avantaj pentru Java.
adăugat autor Joe Phillips, sursa

6 răspunsuri

Nu cred că C# are ceva încorporat, dar știu că există câteva implementări care plutesc pe internet. Există, de asemenea, câteva articole bune despre acest gen de lucruri:

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

Și, în sfârșit...

De fapt, am folosit această bibliotecă ca bază a unei implementări stabilite Am făcut un an în urmă.

0
adăugat

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

0
adăugat
Matt, +1. Asta sună exact cum a cerut el. Se pare că acest lucru a fost adăugat mult timp după scrierea articolului codeproject.
adăugat autor Derek Park, sursa

Cea mai bună implementare pe care am văzut-o face parte din colecțiile minunate de Wintellect Power: 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).

Sper că acest lucru vă ajută!

0
adăugat

Nu, nu există unul nativ în cadru. Există o implementare sursă deschisă pe care majoritatea proiectelor o folosesc (adică nHibernate) numită Iesi.Collections. Iată un articol despre CodeProject:

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

0
adăugat

Iată o implementare simplă:

public sealed class MathSet : HashSet, IEquatable>
{
    public override int GetHashCode() => this.Select(elt => elt.GetHashCode()).Sum().GetHashCode();

    public bool Equals(MathSet obj) => SetEquals(obj);

    public override bool Equals(object obj) => Equals(obj as MathSet);

    public static bool operator ==(MathSet a, MathSet b) =>
        ReferenceEquals(a, null) ? ReferenceEquals(b, null) : a.Equals(b);

    public static bool operator !=(MathSet a, MathSet b) => !(a == b);
}

Exemplu de utilizare:

var a = new MathSet { 1, 2, 3 };
var b = new MathSet { 3, 2, 1 };

var c = a.Equals(b);                       //true

var d = new MathSet> { a, b };//contains one element

var e = a == b;                            //true

Vedeți această întrebare pentru motivul pentru care această abordare a fost considerată peste HashSet .

0
adăugat

Ați verificat HashSet în 3.5?

0
adăugat