Bagaimana set yang diurutkan untuk c # bekerja dengan objek kustom? [duplikat]

Dec 14 2020

Saya mencoba untuk bermain-main dengan set yang diurutkan di c # untuk objek kustom dan untuk beberapa alasan, sepertinya set yang diurutkan mungkin tidak menggunakan referensi objek untuk menyimpan data ..

Dalam potongan kode berikut, saya menggunakan IComparer kustom untuk mengandalkan properti Hitungan kelas kustom. Tetapi untuk beberapa alasan, ini tampaknya memengaruhi fungsionalitas tambah. dan baris counter.Add (dua) tidak membuat penambahan apapun ke himpunan meskipun itu adalah referensi yang berbeda dan memiliki nilai yang berbeda untuk dua properti.

Apakah saya melewatkan sesuatu? Apakah saya mendapatkan kesalahan tentang cara kerja SortedSets di C #?

Cuplikan Kode

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

Terima kasih telah melihat dan membantu!

Jawaban

1 DmitryBychenko Dec 14 2020 at 13:18

Sumur hanya [Sorted]Setdapat berisi item berbeda ; yaitu Settidak dapat memiliki dua item yang lebih sama. Anda membandingkan item (perlakukan mereka sama) sehubungan dengan Count: jika dua item memiliki yang sama, Countmereka dianggap sama. Dalam kode Anda

  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

Anda memiliki one.Count == two.Count == 1bahwa ini mengapa onedan twoyang sama untuk counterset diurutkan. Saat Anda menambahkan item, yang kedua (yaitu two) diabaikan:

  counter.Add(one);
  counter.Add(two); // Ignored: there's already an item (one) with the same Count
  counter.Add(three);

Jika Anda ingin kriteria terpisah (satu untuk Equalsdan yang lainnya untuk pesanan) Anda dapat mencoba yang lama HashSetyang dapat Anda wakili sesuai pesanan dengan bantuan Linq :

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