2009-08-10 3 views
2

Hier ist die Geschichte:prüfen gleiches Objekt ist bereits in einer Liste

Im Versuch, eine Liste von verschiedenen Clustern zu machen ... Ich möchte nur die notwendigen Cluster haben ... Und kann Cluster sein die gleich.

Wie kann ich dies durch Überprüfen einer Liste hinzufügen, wenn die Liste das das Objekt enthält (ich weiß Objekte hier weitergegeben werden kippen)

Das ist meine Probe Zitat:

foreach (Cluster cluster in clustersByProgramme) 
{ 
    if (!clusterList.Contains(cluster)) 
    { 
     clusterList.Add(cluster); 
    } 
} 

Antwort

2

Wenn Sie Verwenden Sie .NET 3.5, verwenden Sie dazu einen HashSet.

HashSet<Cluster> clusterList = new HashSet<Cluster>(); 
foreach (Cluster cluster in clustersByProgramme) 
{ 
    clusterList.Add(cluster); 
} 

In diesem Fall stellt auch sicher, dass, wenn cluster1 == cluster2, dann

cluster1.Equals(cluster2); 
cluster2.Equals(cluster1); //yeah, could be different depending on your impl 
cluster1.GetHashCode() == cluster2.GetHashCode(); 
+0

Ein 'HashSet ' fügt nicht Arbeit - die OP-Liste _kann_ Duplikate enthalten, nur nicht bestimmte Duplikate. –

+0

Ja, es wird funktionieren - er will keine Duplikate hinzufügen. – RichardOD

+0

Es sei denn, ich missverstanden die Anforderungen, die ich nicht glaube, dass ich bin. – RichardOD

3

Ihr Beispiel über so einfach ist, wie es bekommen wird zu. Das einzige, was ich vielleicht empfehlen könnte, ist, dass Sie die Exists Methode verwenden:

Das Prädikat ist ein Delegierter zu einem Methode, die true zurückgibt, wenn das Objekt an sie übergeben die Bedingungen entspricht in den Delegaten definiert. Die Elemente der aktuellen Liste werden einzeln an den Prädikatdelegaten übergeben, und Verarbeitung wird gestoppt, wenn eine Übereinstimmung gefunden wird.

Diese Methode führt eine lineare Suche durch; daher ist diese Methode eine O (n) Operation, wobei n Count ist.

8

Ihr Code sollte funktionieren; Wenn dies nicht der Fall ist, verwenden Sie möglicherweise verschiedene Objektinstanzen, die den gleichen tatsächlichen Cluster darstellen, und Sie haben möglicherweise keine geeignete Equals Implementierung bereitgestellt (Sie sollten auch GetHashCode gleichzeitig aktualisieren).

auch - in .NET 3.5, könnte dies einfach sein:

var clusterList = clustersByProgramme.Distinct().ToList(); 

Als Beispiel für Klasse, die Gleichheitstests unterstützt:

class Cluster // possibly also IEquatable<Cluster> 
{ 
    public string Name { get { return name; } } 
    private readonly string name; 
    public Cluster(string name) { this.name = name ?? ""; } 
    public override string ToString() { return Name; } 
    public override int GetHashCode() { return Name.GetHashCode(); } 
    public override bool Equals(object obj) 
    { 
     Cluster other = obj as Cluster; 
     return obj == null ? false : this.Name == other.Name; 
    } 
} 
+0

+1. Das ist ein guter Punkt über Equals/HashCode. – RichardOD

+0

Bonus, um das Namensfeld readonly zu machen, das ist die korrekte Art, GetHashCode() neu zu implementieren, ohne dass die Welt explodiert;) –

+0

@ Pop- ja unveränderliche Felder sind der Weg zu GetHashCode(). – RichardOD

0

Ihr Code korrekt ist, aber es ist nicht sehr effizient. Sie könnten stattdessen ein HashSet<T> wie folgt verwenden:

HashSet<Cluster> clusterSet = new HashSet<T>(); 
foreach (Cluster cluster in clustersByProgramme) 
    clusterSet.Add(cluster); 

In diesem Fall auch sicherstellen, dass, wenn cluster1 == cluster2, dann

cluster1.Equals(cluster2); 
cluster2.Equals(cluster1); //yeah, could be different depending on your impl 
cluster1.GetHashCode() == cluster2.GetHashCode(); 
0

warum nicht nur Wörterbuch benutzen?

Es ist n (1) solange Ihre Artikel einen guten Hashwert haben.

scheint eine einfache Lösung

Ie dictionary.Contains (key) kann, wenn überhaupt dann aktualisieren n (1)

Sie wird bestehende oder neue

Verwandte Themen