C# - la définition hashset avec clé personnalisée
Je suis en utilisant le HashSet
et Dictionary
en C# pour mettre en œuvre une structure Graphique. J'ai un problème avec l'unicité de HashSet
éléments lors de la HashSet
clé est une mesure de la classe. Ici, j'ai:
public class Point
{
public int x { get; set; }
public int y { get; set; }
}
public class Vertex
{
public Vertex(Point point)
{
VertexLabel = point;
}
public Point VertexLabel { get; private set; }
}
public class Edge
{
public Edge(Vertex to, Vertex from, double weight)
{
FromVertex = from;
ToVertex = to;
Weight = weight;
}
public Vertex FromVertex { get; private set; }
public Vertex ToVertex { get; private set; }
public double Weight { get; private set; }
}
public class Graph
{
public Graph()
{
_Vertexes = new HashSet<Vertex>();
_VertexEdgeMapping = new Dictionary<Vertex, LinkedList<Edge>>();
}
private HashSet<Vertex> _Vertexes;
private Dictionary<Vertex, LinkedList<Edge>> _VertexEdgeMapping;
}
Le problème est que lorsque j'ai même des sommets et je veux les ajouter à la graphique, ils se dupliqué. comment puis-je définir d'une manière que le HashSet
serait de comprendre la singularité de mon sommets?
Par définition, une table de hachage sera toujours le même si la même valeur est transmis en entrée. Si vous avez deux sommets avec exactement la même valeur, ils auront exactement le même hash. Êtes-vous sûr que vous voulez utiliser un HashSet? EDIT: en deuxième lecture, il semble que vous voulez éviter de dupliquer les sommets qui sont les mêmes. Dans l'affirmative, si elles ont les mêmes points de début et fin, alors il y a peut être une autre variable qui est différent. Avez-vous essayé d'utiliser quelque chose comme un n-uplet de la commande des paires représentant le Sommet de début et de fin des points?
Ce n'est pas correct. Veuillez créé deux Vertex objets avec la même valeur de point et de comparer GetHashCode.
Ce n'est pas correct. Veuillez créé deux Vertex objets avec la même valeur de point et de comparer GetHashCode.
OriginalL'auteur Mahsa Teimourikia | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
Options:
Equals
etGetHashCode
dansVertex
(et probablementPoint
pour des raisons de simplicité), très probablement de mettre en œuvreIEquatable<T>
que vous allezIEqualityComparer<Vertex>
et le passer au constructeur de laHashSet<Vertex>
La première option est susceptible d'être le plus simple, mais je voudrais fortement vous recommandons de faire
Point
immuable première: mutable types (ou types de contenant mutable types) ne font pas de bons clés de hachage. Je serais probablement faire unstruct
, trop:... puis remplacer
GetHashCode
etEquals
et de mettre en œuvreIEquatable<>
dansVertex
trop, par exemplex
ety
par des constantes c'est d'aider plus de distribuer le code de hachage. Ce qui fait un point avecX=12
etY=13
avoir un autre code de hachage que d'un point avec unX=13
etY=12
.Je pense que vous avez raté le
override
mot clé surpublic virtual bool Equals(object obj)
Yup, c'est fait.
OriginalL'auteur Jon Skeet
Comme d'autres l'ont dit, remplacer la
GetHashCode()
de laVertex
classe.Également de remplacer le
.Equals
méthode. Dictionnaire d'utiliser les deuxGetHashCode
etEquals
pour déterminer l'égalité.C'est pourquoi
Dictionary
n'est pas de remplacer les sommets. Les sommets avec les mêmes coordonnées sont toujours fondamentalement différente aussi loin que laDictionary
.Je ne vais pas polluer votre question avec encore un autre exemple de code source comme Jon et gzaxx ont offert 2 très beaux exemples déjà.
OriginalL'auteur William Morrison
Remplacer
GetHashCode()
etEquals()
méthodes deVertex
classe.Ci-dessous est un exemple, mais vous devez utiliser un peu mieux algorithme de hachage que le mien 🙂
OriginalL'auteur gzaxx