2016-11-29 2 views
-3

Ich bin eine Liste der Kunden Refs Abrufen es in einem String-Format zu speichern:Liste Objektvergleich

List<string> CustomerRefs(); //List of customer refs 

füge ich einen Kunden in die Liste von

List<Customer> CustomersList = new List<Customer>(); 

foreach (string CustRef in CustomerRefs) 
{ 
    Customer c = new Customer(); 
    c.ref = CustRef; 
    CustomersList.Add(c); 
} 

Ich möchte dann prüfen, ob wir haben Sie diesen Kunden bereits in unserer Datenbank. Wenn nicht, dann sende eine E-Mail. CurrentCustomers ist eine Liste von meiner DB mit unseren aktuellen Kunden

   foreach (Customer cm in CustomersList) 
       { 
        if (!CurrentCustomers.Contains(cm)) 
        { 
         //Email someone 
        } 
       } 

Nun ist die Liste die gleiche ref enthält aber weiterhin //Email someone Linie zu erreichen.

Ich habe ein paar Ideen, warum das vielleicht passiert, ich denke, es vergleicht vielleicht die ID (die immer 0 ist) oder das gesamte Objekt und gegen die Ref, die was ich anvisiere.

So gibt es eine Möglichkeit, die Ref innerhalb des Objekts zu vergleichen, oder habe ich etwas getan und schließlich sollte ich stattdessen nach Kunden in unserer Datenbank suchen, wenn gefunden, fügen Sie es auf CustomersList und vergleichen Sie es so?

Bitte beachten Sie, dass ich MSDN gelesen habe und nur einige Erläuterungen benötigen. Vielleicht habe ich zu viel darin gelesen und sehe das momentan nicht klar.

+1

Das ist * nicht * Ihr Code - Sie haben zwei verschiedene Variablen namens 'c', und Sie versuchen, ein Schlüsselwort ('ref') als Bezeichner zu verwenden. Es ist wirklich schwer zu sagen, was eigentlich vor sich geht, wenn Sie nur Pseudocode bereitstellen. –

+0

Tippfehler - geändert. Wer hat beschlossen, mich zu verurteilen? Kannst du wenigstens erklären warum? – Computer

+2

Ich habe Sie abgelehnt, weil die Frage unklar war. Es ist * immer noch * nicht klar, und es ist * noch * Pseudo-Code. Und wir haben keine Ahnung, woher "CurrentCustomers" von vs CustomerRefs stammt, oder ob "Customer" "Equals" außer Kraft setzt. Bitte geben Sie eine [MCVE] an. –

Antwort

1

Sie können Contains nicht verwenden, da Sie scheinen, separate Instanzen Ihrer Objekte zu erstellen, obwohl einige von ihnen die gleichen ID teilen und somit logisch die "gleichen" Entitäten darstellen.

Enthält eine Standardgleichheitsvergleichs verwendet, die die Objektreferenzen der einzelnen Instanzen von Customer und andernfalls vergleicht true zurückzukehren, auch in Fällen, in denen Ihre Customer Objekte denselben ID haben. Sie müssen die ID Werte vergleichen. Dazu können Sie the Any extension method verwenden:

foreach (Customer cm in CustomersList) 
{ 
    if (!CurrentCustomers.Any((x) => x.ID == cm.ID)) 
    { 
     //Email someone 
    } 
} 

Die Ausgabe verrät ein potenziell größeres Problem, though. Sie können Probleme auftreten, wenn Sie separate Instanzen von Objekten haben, die logisch das "gleiche" Objekt darstellen (z. B. basierend auf einer eindeutigen ID). Ich würde vorschlagen, nur eine Instanz jedes Objekts beizubehalten, das "gleich" ist. Dazu können Sie eine Identity Map verwenden.

+0

Danke - das hat den Trick gemacht. Schätze deine Gedanken. Es gibt eine Instanz, die ich gerade den Code geändert habe, um das zu demonstrieren, da ich wusste, dass es einen anderen Weg geben muss. – Computer

Verwandte Themen