Comment les ensembles triés pour c # fonctionnent-ils avec des objets personnalisés? [dupliquer]
J'essaie de jouer avec des ensembles triés en c # pour des objets personnalisés et pour une raison quelconque, il semble que les ensembles triés n'utilisent peut-être pas les références des objets pour stocker les données.
Dans l'extrait de code suivant, j'utilise un IComparer personnalisé pour me fier à la propriété Counts de la classe personnalisée. Mais pour une raison quelconque, cela semble affecter la fonctionnalité d'ajout. et la ligne counter.Add (two) ne fait aucun ajout à l'ensemble, même s'il s'agit d'une référence différente et a une valeur différente pour deux propriétés.
Est-ce que je manque quelque chose? Est-ce que je me trompe sur la façon dont les SortedSets sont censés fonctionner en C #?
Extrait de code
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);
}
}
}
Merci d'avoir regardé et aidé!
Réponses
Well [Sorted]Set
ne peut contenir que des éléments distincts ; ie Set
ne peut pas avoir deux éléments plus égaux. Vous comparez les éléments (les traitez comme égaux) par rapport à Count
: si deux éléments sont identiques, Count
ils sont considérés comme égaux. Dans votre 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
vous avez one.Count == two.Count == 1
c'est pourquoi one
et two
sont égaux pour l' counter
ensemble trié. Lorsque vous ajoutez des éléments, le second (qui est two
) est ignoré:
counter.Add(one);
counter.Add(two); // Ignored: there's already an item (one) with the same Count
counter.Add(three);
Si vous voulez des critères séparés (l'un pour Equals
et l'autre pour la commande), vous pouvez essayer le bon vieux HashSet
que vous pouvez représenter comme ordonné avec l'aide de 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);