2016-07-20 7 views
0

Ich habe eine ReactiveList<Monitor> Monitors, und eine IEnumerable<Monitor> newMonitors. Im Inneren des Monitors, ist es ein einzigartiges SN definiert:Wie füge ich einen IEnumerable in eine ReactiveList ein und entferne die doppelten Einträge?

public class Monitor 
{ 
    public string SN {get;set;}//unique 
} 

ReactiveList<Monitor> Monitors 
IEnumerable<Monitor> newMonitors 

Jetzt möchte ich die newMonitors in Monitors verschmelzen und die duplizierten Artikel von SN entfernen.

Ich versuche, das Verfahren durch ReactiveList anstatt allgemeine LINQ zu nutzen, weil ich die Benachrichtigung von ReactiveList und seinen DerivedCollection behalten will, die in meiner Bindung verwendet werden.

Meine aktuelle Lösung ist, wenn die Elemente bereits überprüfen existiert, und fügen Sie eins nach dem anderen, wie

foreach (var m in newMonitors) 
{ 
    if(Monitors.Contains(m))//to override the comparison operators here 
     continue; 
    else 
     Monitors.Add(m); 
} 

ich denke, die Leistung niedrig sein wird, wenn newMonitors gräflichen Tausende sein könnte.

Jeder andere elegante Weg, dies zu tun?

Fei

Antwort

0

Sie eine Hashset halten und behalten den Überblick über die Tasten, die parallel hinzugefügt wurden, werden nur Schmerzen, wenn Sie hinzufügen oder Notwendigkeit entfernen sicherzustellen, dass Sie aus den beiden Sammlungen zu entfernen

setzen Sie in Ihrem Klassenvariable

private readonly HashSet<string> _monitorSet = new HashSet<string>(); 

Dann in der Schleife

foreach (var m in newMonitors) 
{ 
    if(_monitorSet.Contains(m.SN)) 
     continue; 
    else 
    { 
     _monitorSet.Add(m.SN); 
     Monitors.Add(m); 
    } 
} 
0

Zu diesem Code-Schnipsel gibt es zwei Optionen, die ich mir vorstellen kann:

  1. Haben ReactiveList intern Verwendung eines machen ISet (wahrscheinlich `HashSet für seine‚Liste‘hier Monitor), dann wird es die Verwendung von Hash-Codes machen vergleiche für eine O (nlog (n)) oder ungefähre Insertionszeit. Natürlich müsste Monitor GetHashCode() und Equals() überschreiben! Sie können wahrscheinlich etwas mit Eigenschaften, Gettern und Settern herausfinden, um dies Ihren Bedürfnissen anzupassen.

  2. Wenn Sie dies nicht tun können, ist die Einsetzzeit von O (nn) die beste, die Sie haben (ohne Ihren eigenen benutzerdefinierten Einfüge-/Tracking-Code zu erstellen). ABER ist wahrscheinlich in Ordnung, solange Ihr Vergleichscode einfach ist. Im Falle eines Saitenvergleichs nur bei SN wäre ich nicht so besorgt über die Geschwindigkeit, aber beachte das Folgende.

Achten Sie darauf, nicht den Standard-Operator ==, wenn Strings kritisch in Performace zu vergleichen (und Nicht-Sprache verwandt) Szenarien gibt es einige Themen auf schnellen String-Vergleichen auf SO an anderer Stelle: P