2010-03-07 15 views
21

Ich habe eine Situation, in der ich einen sehr unnormierten Datensatz aus Excel geladen habe. Ich ziehe jede Reihe und erzeuge nacheinander die Objekte daraus. Jede Zeile könnte eine Firma und/oder einen Kunden enthalten.C# zwei Objekte zur Laufzeit zusammenführen

Mein Problem ist, dass mehrere Zeilen die gleichen Objekte haben könnten, also habe ich es vielleicht schon erstellt. Ich vergleiche, ob es schon in der Liste steht. Wenn dies der Fall ist, muss ich die beiden Objekte zusammenführen, um sicherzustellen, dass ich keine neuen Informationen aus der zweiten Zeile erhalten habe.

so:

company - client - address - phone 
---------------------------------------- 
mycompany -   - myaddress - 
mycompnay - myclient -   - myphone 

so die erste Zeile würde ein Unternehmen Objekt mit der Adresse "meineadresse" erstellen. Die zweite Zeile würde ein anderes Firmenobjekt erstellen (das nach meinen Regeln dieselbe Firma ist wie der Name), dies hat auch eine Kundenreferenz und eine Telefonnummer.

So würde ich wissen, dass sie gleich sind, aber sicherstellen müssen, dass alle Daten in einem Objekt zusammengeführt werden.

Im Moment erstelle ich eine Utility-Klasse, die beide Objekte übernimmt (eines ist das Primäre und das andere ist verschmolzen, also hat es Priorität, wenn es einen Konflikt gibt), es durchläuft jede Variable und weist die Werte zu wenn es welche gibt. Dies ist ein bisschen Kesselplatte schwer und ich hatte gehofft, dass es einen Nutzen gibt, den ich verwenden könnte, um die manuelle Arbeit für mich zu machen.

Das Beispiel wurde vereinfacht, da es einige wenige andere Variablen gibt, einige grundlegende Typen und andere, die komplexere Elemente sind.

+0

Sind Sie sicher, dass immer maximal 2 Objekte zusammengeführt werden müssen? Was passiert, wenn dieselbe Spalte/Eigenschaft zweimal definiert ist? Klingt gefährlich, nur um einen zu ignorieren !? – Achim

+0

Sie durchlaufen meine Sammlungen in dem Moment, in dem ich in jedem gefundenen Match fusionieren würde. Theoretisch könnte es mehrere Übereinstimmungen durch die Sammlung geben, aber jede Zusammenführung würde einzeln durchgeführt werden. Wenn die Benutzer schlechte Daten eingegeben haben, so dass ich wegen mehrerer Felder einen gewissen Wert verlieren muss, kann ich sowieso nicht sehen. – Jon

Antwort

37

Reflexion würde funktionieren. Etwas wie:

+7

Generika und elegant. Aber irgendwie lässt es einen eisigen Schauer über meinen Rücken laufen. – CesarGon

+0

Sehr schöne Hüte, Sir! ;-) – BlackTea

+1

Aus irgendeinem Grund gibt 'priValue == Activator.CreateInstance (pi.PropertyType)' false für Werttypen zurück. Stattdessen erzeugt 'priValue.Equals (Activator.CreateInstance (pi.PropertyType))' eine korrekte Ausgabe. – Mrchief

1

Versuchen Sie, eine stringbasierte Hashtabelle zu erstellen. Verwenden Sie eine Verkettung einer Teilmenge von Feldern, die Sie als Auslöser für einen doppelten Datensatz als Schlüssel ansehen. Die Hashtabelle lässt keine Duplikate zu, sodass Sie diesen Fehler als Auslöser für die weitere Verarbeitung verwenden können.

0

Ohne viel mehr über Ihre Umgebung und Ihre Anforderungen zu wissen, kann dies nutzlos sein. Wenn Sie jedoch ein Datenbank-Back-End zur Verfügung haben (sogar freie clientseitige), können Sie die Daten in einer Tabelle speichern und die SQL Merge-Anweisung verwenden, um die Daten zu aktualisieren. Eine Zusammenführungsoperation fügt einen Datensatz nach Bedarf hinzu oder aktualisiert ihn. Ein Auslöser könnte die Operation weiter verfeinern. Dies ist eine ziemlich schwergewichtige Lösung, aber wenn Sie bereits einige DBMS im Mix haben, kann dies eine einfache Methode zur Implementierung sein.

3

Ich würde versuchen, dies aufzuteilen: teile und herrsche.

Lesen Sie zuerst alle Objekte in einer riesigen Liste.

In einem zweiten Schritt wählen Sie verschiedene Listen mit Ihrem Primärschlüssel aus, z. B. den Firmennamen. Verwenden Sie in der eindeutigen Liste das Element (den Master) mit der größten Anzahl an Feldern. Dann iteriere über alle Felder, die noch nicht im Master sind und führe ihre Werte zusammen. LINQ wird dir in vielen dieser Schritte sehr helfen, ohne komplizierte Algorithmen manuell codieren zu müssen.

Dies ermöglicht die Anpassung der Logik später, z.B. wenn Sie sozusagen einen anderen Satz von Primärschlüsseln haben oder wenn Sie spezielle Vergleiche bestimmter Felder durchführen möchten.

0

Wenn Sie die Daten aus Excel abrufen, müssen Sie kein Objekt für jede Zeile erstellen.In der Tat möchten Sie wahrscheinlich zu einem Zwischenformular gehen, das alle Zeilen im Vordergrund liest, dann erstellt es die Objekte von dort. Kibbeys Lösung mit Hash-Tabellen könnte auch hier funktionieren.

+0

Hallo, Entschuldigung, ich habe mein Beispiel etwas vereinfacht. Ich lese die ganzen xls direkt in eine Datentabelle und erstelle dann eine Struktur für jede Zeile, um meine Verarbeitung auszuführen, anstatt mich direkt damit zu beschäftigen. – Jon

2

Ich habe versucht Merge Two Objects into an Anonymous Type von Kyle Finley und es funktioniert perfekt.

Mit dem TypeMerger die Verschmelzung so einfach wie

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2);

, dass es Ihnen das fusionierte Objekt bekam, davon abgesehen, gibt es eine Bestimmung zu ignorieren spezifische Eigenschaften auch.

+1

Welcher Namensraum ist TypeMerger? Ich gehe davon aus, dass es ein benutzerdefiniertes Objekt ist, weil ich es nicht finden kann, selbst wenn ich Google suche. –

Verwandte Themen