Wie funktionieren sortierte Mengen für c # mit benutzerdefinierten Objekten? [Duplikat]

Dec 14 2020

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

1 DmitryBychenko Dec 14 2020 at 13:18

Nun [Sorted]Setkann nur verschiedene Elemente enthalten ; dh Setkann nicht mehr zwei gleiche Gegenstände haben. Sie vergleichen Artikel (behandeln sie als gleich) in Bezug auf Count: Wenn zwei Artikel gleich sind, werden Countsie 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 == 1deshalb oneund twosind gleich für die countersortierte 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 Equalsund das andere für die Bestellung), können Sie gutes Altes ausprobieren, HashSetdas 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);