Bagaimana set yang diurutkan untuk c # bekerja dengan objek kustom? [duplikat]
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
Sumur hanya [Sorted]Set
dapat berisi item berbeda ; yaitu Set
tidak dapat memiliki dua item yang lebih sama. Anda membandingkan item (perlakukan mereka sama) sehubungan dengan Count
: jika dua item memiliki yang sama, Count
mereka 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 == 1
bahwa ini mengapa one
dan two
yang sama untuk counter
set 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 Equals
dan yang lainnya untuk pesanan) Anda dapat mencoba yang lama HashSet
yang 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);