Como conjuntos classificados para c # funcionam com objetos personalizados? [duplicado]
Estou tentando brincar com conjuntos classificados em c # para objetos personalizados e, por algum motivo, parece que os conjuntos classificados podem não estar usando as referências dos objetos para armazenar os dados.
No trecho de código a seguir, eu uso um IComparer personalizado para contar com a propriedade Counts da classe personalizada. Mas, por algum motivo, isso parece afetar a funcionalidade de adição. e a linha counter.Add (two) não faz nenhuma adição ao conjunto, embora seja uma referência diferente e tenha um valor diferente para duas propriedades.
Estou esquecendo de algo? Eu entendi algo errado sobre como os SortedSets deveriam funcionar em C #?
Fragmento de código
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);
}
}
}
Obrigado por dar uma olhada e ajudar!
Respostas
O poço [Sorted]Set
pode conter apenas itens distintos ; ou seja, Set
não pode ter mais dois itens iguais. Você compara os itens (trata-os como iguais) em relação a Count
: se dois itens têm o mesmo, Count
eles são considerados iguais. Em seu código
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
você tem one.Count == two.Count == 1
por isso one
e two
são iguais para o counter
conjunto classificado. Quando você adiciona itens, o segundo (que é two
) é ignorado:
counter.Add(one);
counter.Add(two); // Ignored: there's already an item (one) with the same Count
counter.Add(three);
Se você quiser critérios separados (um para Equals
e o outro é para pedido), você pode tentar o bom e velho, HashSet
que pode representar como pedido com a ajuda do 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);