Liste.Enthält, schlägt fehl, Objekt-Vergleich
Habe ich eine Klasse "Class1", hat eine string-variable "sText" in .NET 2.0. Ich erstellte eine Liste von Objekten der Klasse "lstClass1". Es speichert viele Objekte dieser Klasse nach dem setzen der string-variable.
Vollständige code ist:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (!lstClass1.Contains(new Class1("text1")))
lstClass1.Add(new Class1("text1"));
}
public List<Class1> lstClass1 = new List<Class1>();
}
public class Class1
{
public Class1(string sText)
{
this.sText = sText;
}
public string sText = "";
}
Nun, das problem ist, dass ich möchte nur hinzufügen, die Objekte der Klasse, die hat Zeichenfolge mit einzigartigen text-Wert. Zum Beispiel, wenn lstClass1 bereits ein Objekt mit string-variable mit dem Wert "text1", dann sollte es nicht erlauben das hinzufügen eines Objekts, auch "text1". Also, ich schrieb code:
if (!lstClass1.Contains(new Class1("text1")))
lstClass1.Add(new Class1("text1"));
Aber es erlaubt immer den text "text1" Hinzugefügt werden, selbst wenn es bereits ein Objekt in der Liste mit "text1" string. Meine Vermutung war, dass auf die erste Schaltfläche click-Ereignis "button1_Click", wird das Objekt Hinzugefügt, da die Liste leer ist, sondern auf die Schaltfläche weiter klicken Sie auf die Liste.Enthält Funktion wird überprüft, ob es bereits ein Objekt in der Liste mit string-Variablen "text1" und wenn gefunden, dann wird es nicht Hinzugefügt werden. Aber es immer ermöglichen, das Objekt mit dem text "text1", auch wenn es schon in der Liste vorhanden.
Bitte beachten: ich habe nicht eine einfache Liste von strings oder ein string, denn ich möchte Ihnen mein großes problem der Liste Klassen und Objekte in einer einfachen Weise.
- Haben Sie eine Umsetzung der Standard-Equals-und GetHashCode-Methoden von Class1?
- stackoverflow.com/questions/10454519/...
- Nicht sicher, warum Sie nicht speichern, dass
new Class1("text1")
in eine neueClass1
typisierte Variablen, btw. Es gibt keine Notwendigkeit, um es zu konstruieren zweimal. Nur Konstrukt einmal, überprüfen Sie es auf die variable und speichern Sie es dann aus der variable.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
Any()
Methode:Diesem code:
Konnte nur funktionieren, wenn geben Sie den
Equals()
undGetHashCode()
Methoden für IhreClass1
zu ermöglichen, dass die Vergleiche zwischen zwei Objekten dieser Klasse. Um dies zu erreichen Ihrer Klasse umsetzen sollten, dieIEquatable
- Schnittstelle.So Ihr Class1 könnte wie folgt Aussehen:
Enthält nur korrekt funktioniert, wenn Sie implementieren, IEquatable in Ihrem Fall.
Können Sie stattdessen den folgenden code verwenden:
Kommentieren Sie die kommentierten Zeilen und Sie werden den Unterschied sehen.
Dies schlägt fehl, da die Liste nennt
Equals
auf Ihrem Beispiel, und die Standard-Implementierung führt eine Prüfung auf Referenz-Gleichheit. Obwohl das Objekt die name-Eigenschaft-Wert es ist ein Unterschied-Instanz, und so die Referenzen werden nicht gleich sein.In
Class1
überschreiben derEquals
Methode zum Vergleich der zugrunde liegenden EigenschaftenDas problem, das Sie konfrontiert sind, ist hier zwischen Objekt und Instanz. Wenn Sie überprüfen Sie die folgenden, Sie sind im Grunde die Fragen "ist in der Sammlung?"
Gut, es kann natürlich nicht sein, da Sie gerade erst erstellt. Was Sie brauchen, um zu überprüfen, ist der Inhalt des Objekts. Der einfachste Weg, dies zu tun, so dass es zu iterieren durch die Sammlung und Prüfung für die Inhalte der einzelnen Objekte.
Dies ist sehr einfach zu tun mit LINQ (obwohl ich nicht sicher bin, ob es verfügbar ist .NET 2.0):
Andere Lösung wäre, überschreiben die
GetHashCode()
undEquals
Methoden Ihrer Class1 zu prüfen, zwei Objekte "gleich", wenn Ihre Inhalte gleich sind. und damit ein gründlicher Vergleich stattfinden.