C # SortedSet e uguaglianza

Sono un po ‘perplesso sul comportamento di SortedSet, vedi il seguente esempio:

public class Blah { public double Value { get; private set; } public Blah(double value) { Value = value; } } public class BlahComparer : Comparer { public override int Compare(Blah x, Blah y) { return Comparer.Default.Compare(x.Value, y.Value); } } public static void main() { var blahs = new List {new Blah(1), new Blah(2), new Blah(3), new Blah(2)} //contains all 4 entries var set = new HashSet(blahs); //contains only Blah(1), Blah(2), Blah(3) var sortedset = new SortedSet(blahs, new BlahComparer()); } 

Quindi SortedSet scarta le voci se Compare (x, y) restituisce 0. Posso impedire questo, in modo tale che il mio SortedSet si comporti come HashSet e scarta le voci solo se Equals () restituisce true?

Puoi farlo se fornisci un confronto alternativo quando i Valori sono uguali e il metodo Compare altrimenti restituire 0. Nella maggior parte dei casi questo probabilmente rimanderebbe il problema invece di risolverlo. Come altri hanno notato, SortedSet scarta i duplicati e quando si fornisce un confronto personalizzato lo usa per determinare la duplicità.

  static void Main(string[] args) { var blahs = new List { new Blah(1, 0), new Blah(2, 1), new Blah(3, 2), new Blah(2, 3) }; blahs.Add(blahs[0]); //contains all 4 entries var set = new HashSet(blahs); //contains all 4 entries var sortedset = new SortedSet(blahs, new BlahComparer()); } } public class Blah { public double Value { get; private set; } public Blah(double value, int index) { Value = value; Index = index; } public int Index { get; private set; } public override string ToString() { return Value.ToString(); } } public class BlahComparer : Comparer { public override int Compare(Blah x, Blah y) { // needs null checks var referenceEquals = ReferenceEquals(x, y); if (referenceEquals) { return 0; } var compare = Comparer.Default.Compare(x.Value, y.Value); if (compare == 0) { compare = Comparer.Default.Compare(x.Index, y.Index); } return compare; } } 

Descrizione

SortedSet: hai molti elementi che devi memorizzare e vuoi memorizzarli in un ordine ordinato ed eliminare anche tutti i duplicati dalla struttura dei dati. Il tipo SortedSet, che fa parte dello spazio dei nomi System.Collections.Generic nel linguaggio C # e .NET Framework, fornisce questa funzionalità.

Secondo i ritorni del metodo di Compare MSDN

  • Meno di zero se x è minore di y.
  • Zero se x è uguale a y.
  • Maggiore di zero se x è maggiore di y.

Maggiori informazioni

  • Dotnetperls – C # SortedSet Esempi
  • MSDN: confronta metodo

Aggiornare

Se la tua class Bla implementa IComparable e vuoi che la tua lista sia ordinata, puoi farlo.

 var blahs = new List {new Blah(1), new Blah(2), new Blah(3), new Blah(2)}; blahs.Sort(); 

Se la tua class Bla NON implementa IComparable e vuoi che la tua lista sia ordinata, puoi usare Linq (spazio dei nomi System.Linq) per quello.

 blahs = blahs.OrderBy(x => x.MyProperty).ToList(); 

Non puoi trovare l’altro Blah(2) perché stai usando un Set .

 Set - A collection of well defined and **distinct** objects 

MultiSet , ad esempio, consente oggetti duplicati.