Quelqu'un peut-il me dire comment ObjectIDGenerator est meilleur (pire?) Puis utiliser HashSet lors de la traversée d'une hiérarchie d'objets (qui peut être recurvise/circulaire), et ne pas vouloir traverser le même objet deux fois?ObjectIDGenerator vs HashSet <T>
Répondre
La différence fondamentale réside dans la façon dont chacun fait l'égalité.
ObjectIdGenerator examine l'identité référentielle. Lors de la vérification pour voir si un objet est déjà présent, il suffit de faire un appel == sur les deux instances d'objet. Cela se résume à une comparaison de référence car les objets sont de type statique à être objet à ce stade. C'est correct à moins que votre objet utilise explicitement .Equals() pour l'égalité. Si deux objets sont égaux via .Equals() mais des références différentes, ObjectIDGenerator les considérera comme des objets différents. Probablement pas ce que tu veux. Par contre, HashSet vous permet de personnaliser la façon dont vous comparez les objets via le paramètre IEqualityComparer <T>. Si aucun n'est spécifié, il utilisera EqualityComparer <T> .Default qui utilisera l'égalité des valeurs. Cette méthode appellera .Equals() et en dépendra pour déterminer si deux objets sont égaux. Dans le cas où vous n'avez pas défini une méthode .Equals() pour vos types, elle reviendra par défaut à l'égalité de référence qui est presque certainement ce que vous voulez.
En bref, rendez-vous avec HashSet :)
Exemple de code montrant la différence:
class Person
{
public readonly string Name;
public Person(string name) { Name = name; }
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Person;
if (other == null)
{
return false;
}
return StringComparer.Ordinal.Equals(Name, other.Name);
}
}
public static void Example()
{
var gen = new ObjectIDGenerator();
bool isFirst;
var person1 = new Person("John");
var person2 = new Person("Bob");
gen.GetId(person1, out isFirst); // isFirst = true
gen.GetId(person1, out isFirst); // isFirst = true
gen.GetId(person2, out isFirst); // isFirst = false
gen.GetId(new Person("John"), out isFirst); // isFirst = true even though they are .Equals()
var set = new HashSet<Person>();
set.Add(person1);
var contains1 = set.Contains(person1); // true
var contains2 = set.Contains(new Person("John")); // true
}
- 1. Pourquoi HashSet <T> .IsReadOnly explicite?
- 2. Utilisation de HashSet <T> dans C# Properties.Settings
- 3. <iostream> vs vs <iostream.h> « iostream.h »
- 4. <?> vs <T>
- 5. "<>" vs "NOT IN"
- 6. "string.h" VS <string.h>
- 7. HashSet dans WCF
- 8. <? Php vs <? ...Est-ce que ça importe?
- 9. Implémentations de collections Java (par exemple HashMaps vs HashSet vs HashTable ...), quel est le coût de choisir le mauvais?
- 10. Conteneur C++ rapide comme le C# HashSet <T> et le Dictionnaire <K,V>?
- 11. Quelle est la particularité de HashSet <T> dans .NET 3.5?
- 12. Supprimer d'un HashSet échouant après l'avoir parcouru
- 13. Scala équivalent de nouvelle HashSet (Collection)
- 14. Conversion de Hashset C# en listes
- 15. Comment utiliser pour un HashSet Comparer
- 16. supprimer des éléments d'un HashSet tout Itération
- 17. Utilisation de la comparaison alternative dans HashSet
- 18. double.Epsilon vs. std :: numeric_limits <double> :: min()
- 19. <script runat = "server"> vs code-behind
- 20. <button> comportement dans Firefox vs IE
- 21. .NET List <T> Concat vs AddRange
- 22. C# List <double> size vs double [] size
- 23. ILookup <TKey, TVal> vs IGrouping <TKey, TVal>
- 24. WPF IEnumerable <T> vs IQueryable <T> comme DataSource
- 25. quand utiliser Collection <T> vs Liste <T>
- 26. VS 2008 ne cesse de supprimer et de rajouter <SubType> ASPXCodeBehind</SubType>
- 27. Sérialisation du contenu de Hashset dans une table SQL
- 28. Méthode ValidationService - "T2 Valider <T1, T2> (Expression, T2)" vs "objet Valider <T1> (Expression, objet)"
- 29. Tortoise svn ajoutant <<<< aux fichiers!
- 30. <% $, <% @, <% =, <% # ... quel est le problème?