Wie funktionieren sortierte Mengen für c # mit benutzerdefinierten Objekten? [Duplikat]
Ich versuche, mit sortierten Mengen in c # für ein benutzerdefiniertes Objekt herumzuspielen, und aus irgendeinem Grund scheinen die sortierten Mengen möglicherweise nicht die Referenzen der Objekte zum Speichern der Daten zu verwenden.
Im folgenden Codeausschnitt verwende ich einen benutzerdefinierten IComparer, um mich auf die Counts-Eigenschaft der benutzerdefinierten Klasse zu verlassen. Aus irgendeinem Grund scheint dies jedoch die Add-Funktionalität zu beeinträchtigen. und die Zeile counter.Add (two) fügt der Menge keine Addition hinzu, obwohl es sich um eine andere Referenz handelt und für zwei Eigenschaften einen anderen Wert hat.
Vermisse ich etwas Habe ich etwas falsch gemacht, wie SortedSets in C # funktionieren sollen?
Code-Auszug
public class SortedStructureTesting
{
public void TestingSortedSets()
{
SortedSet<CounterSetup> counter = new SortedSet<CounterSetup>(new CompareCounts());
CounterSetup one = new CounterSetup(1);
CounterSetup two = new CounterSetup(2);
CounterSetup three = new CounterSetup(3, 2);
counter.Add(one);
counter.Add(two); // Does not work. This value does not get added to the set.
counter.Add(three);
var max = counter.Max;
counter.Remove(max);
var sec = counter.Max;
counter.Remove(sec);
}
public class CounterSetup
{
public static Random random = new Random();
public CounterSetup(int no, int cnt = 1)
{
Number = no;
Count = cnt;
Blah = new string(Guid.NewGuid().ToString());
}
public int Number { get; private set; }
public int Count { get; set; }
public string Blah { get; private set; }
}
public class CompareCounts : IComparer<CounterSetup>
{
public int Compare(CounterSetup one, CounterSetup two)
{
return one.Count.CompareTo(two.Count);
}
}
}
Vielen Dank für Ihren Blick und Ihre Hilfe!
Antworten
Nun [Sorted]Set
kann nur verschiedene Elemente enthalten ; dh Set
kann nicht mehr zwei gleiche Gegenstände haben. Sie vergleichen Artikel (behandeln sie als gleich) in Bezug auf Count
: Wenn zwei Artikel gleich sind, werden Count
sie als gleich betrachtet. In deinem Code
CounterSetup one = new CounterSetup(1); // one.Count == 1
CounterSetup two = new CounterSetup(2); // two.Count == 1
CounterSetup three = new CounterSetup(3, 2); // three.Count == 2
Sie haben one.Count == two.Count == 1
deshalb one
und two
sind gleich für die counter
sortierte Menge. Wenn Sie Elemente hinzufügen, wird die zweite (dh two
) ignoriert:
counter.Add(one);
counter.Add(two); // Ignored: there's already an item (one) with the same Count
counter.Add(three);
Wenn Sie getrennte Kriterien wünschen (eines für Equals
und das andere für die Bestellung), können Sie gutes Altes ausprobieren, HashSet
das Sie mit Hilfe von Linq wie bestellt darstellen können :
using System.Linq;
...
// Items in counter are unique (based on MyEqualityComparer)
HashSet<CounterSetup> counter = new HashSet<CounterSetup>(
new MyEqualityComparer()
);
// Now we order counter items by different criterium (here we sort by `Count`)
var ordered = counter
.OrderBy(item => item.Count);