Laden...

Aus zwei Listen die Elemente ermitteln, die nur in einer der beiden Listen enthalten sind

Erstellt von Damlo vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.975 Views
Hinweis von herbivore vor 10 Jahren

vorneweg: ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Der Originaltitel war: "Datagridview ausgabe anpassen"

D
Damlo Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren
Aus zwei Listen die Elemente ermitteln, die nur in einer der beiden Listen enthalten sind

Hallo,

ich bin momentan dran ein Programm zu entwickeln in dem unterschiedliche Datenbankstrukturen angezeigt werden.

Sprich z.B. :
MSSQL hat 3 Tabellen [ Kunde, Vertrag, Auto ].
Informix hat 2 Tabellen [ Kunde, Vertrag].

So jetzt komm ich zu meinem Problem. Ich will dann als Ausgabe in einer Informix spalte Auto stehen haben.

Ich habe alles in ArrayListen gespeichert( also die MSSQL Daten und Informix Daten)

Bei dem Vergleichen der zwei ArrayListen scheitere ich momentan. Ich bekomme es hin das er mir alle ausgibt, aber nicht das er mir nur Auto ausgibt.

Ich hab ein mal in Klein verfasst und zwei Array Listen zusammen gestellt mit kleinen Daten. Diese Sind unterschiedlich oder auch gleich. Und ausgegeben werden sollte in der Liste dann in einem datagridview. in der ich 3 Spalten habe. ID / SQL / INFORMIX.
Es sollte dann beispielsweise so aussehen:

[pre]
id   SQL   Informix 
1      1    
2                3
3                4
4                5 
[/pre]

hier mein bisheriger Code:

ArrayList testsql= new ArrayList(); 
            ArrayList testinfor= new ArrayList();

            testsql.Add("1");
            testsql.Add("2");
            testsql.Add("3");
            

            testinfor.Add("2");
            testinfor.Add("3");
            testinfor.Add("4");
            testinfor.Add("5");

            int a = 1;

            foreach (var s1 in testsql)
            {
                foreach (var s2 in testinfor)
                {
                    if (s1.Equals(s2))
                    {
                        dataGridView1.Rows.Add(a, s1, s2);
                        break;
                    } 
                } 
                a++;
            }
C
2.122 Beiträge seit 2010
vor 10 Jahren

Gibts einen Preis für den ersten der das versteht? Ich bin es jedenfalls nicht.
Dein Beispielcode passt nicht zur Ausgabe, soviel sehe ich.

Ich bekomme es hin das er mir alle ausgibt

Alle was?
Auto ausgeben?
Sorry aber ich verstehe da wirklich überhaupt nichts.

D
Damlo Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Entschuldige, wenn ich mich unverständlich ausgedrückt hab.

Also, ich versuch es nochmal Kurz und knapp zu erklären:

Ich hab zwei unterschiedliche Datenbanken und möchte die Struktur der Datenbanken auf unterschiede Prüfen.
Ich schaffe es von jeder Datenbank die Tabellenstruktur ausgeben zu lassen und füge diese jeweils einer Arraylist hinzu.

Aber ich möchte diese ja auf unterschiede Prüfen, Heißt 2 Arraylisten mit jeweils der Tabellennamen von Informix und MSSQL.

Ausgegeben werden sollen nur die Unterschiede in den Passenden Spalten (Informix oder MSSQL).

Ich hoffe dies war verständlicher, falls aber noch was unklar ist, kannst du/ihr gerne fragen 😃

G
141 Beiträge seit 2011
vor 10 Jahren

Hallo Damlo,

  1. ArrayList gehört in die Mottenkiste, verwende eine List<T>

Grob gesagt geht es also darum, dass du 2 Listen miteinander vergleichen möchtest und nur die Unterschiede in das DGV schreiben willst? (hab ich gewonnen? :>

Dies lässt sich mit einer for schleife lösen:


for(int i = 0; i < testSql.Count; i++)
{
  if(testSql[i] == testinfor[i])
    Ausgabe ins DGV
}

Das ist aber nur Pseudocode.

Gruß
Gnozo

D
Damlo Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

ich habe List<T> leider noch nie benutzt. Kann mir da jemand mal ein kleines Beispiel zeigen? Wie z.b. das in meinem ersten Post?

wenn ich diese if nehme, kommen doch nur die Gleichen ins DGV. Es sollen aber nur die unterschiedlichen reinkommen.

Hinweis von herbivore vor 10 Jahren

Den Umgang mit den grundlegenden Collections setzen wir als bekannt voraus. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 (und 4a).

G
141 Beiträge seit 2011
vor 10 Jahren

Hallo Damlo,

Bitte beachte [Hinweis] Wie poste ich richtig? (Punkt 4)

List<T> gehört zu den Grundlagen. Siehe dazu:List<T> Methoden

Um ungleiche Vergleiche durchzuführen, verwende den != Operator, welcher aber auch zu den absoluten Grundlagen gehört.

Gruß
Gnozo

D
Damlo Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

Erstmal Danke das du mich darauf hingewiesen hast, mit "Wie poste ich richtig" werde versuchen es alles genauer zu beachten!

Um ungleiche Vergleiche durchzuführen, verwende den != Operator, welcher aber auch zu den absoluten Grundlagen gehört.

habe da an 2 Forschleifen gedacht, und da wären ja dann unzählige unnütze ausgaben bei raus gekommen.

Habe das jetzt mal bearbeitet,

meintest du das ungefähr so?:

List<string> alIterate; // the ArrayList to iterate
            List<string> alCompare; // the ArrayList to compare

            if (ausgabeSQL.Count > ausgabeInfo.Count)
            {
                alIterate = ausgabeSQL;
                alCompare = ausgabeInfo;
            }
            else
            {
                alIterate = ausgabeInfo;
                alCompare = ausgabeSQL;
            }

            for (int i = 1; i < alIterate.Count; i++)
            {
                if (alCompare[i] != alIterate[i])
                {
                    dataGridView1.Rows.Add(i, alCompare, alIterate);
                }                
            }

da ich auch ungleiche anzahlen in der Liste hab, bekomme ich momentan ein Fehler:

Fehlermeldung:
Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.

Hast du da auch eine schnelle Idee wie ich dies beheben könnte?

H
114 Beiträge seit 2007
vor 10 Jahren

Hallo Damlo,

ich glaube der Beitrag bewegt sich hart an der Grenze zu einem Grundlagenbeitrag.
Aber als kleiner Hinweis...
Wenn die Spaltennamen in jeweils 2 Listen mit Strings vorliegen und du nur die Unterschiede wissen möchtest, so kannst du der Einfachkeit halber auch auf Enumerable.Except zurückgreifen.
Als Ergebnis bekommt dann eine Auflistung der Unterschiede, welche du problemlos weiterverwenden kannst (z.B. für die Anzeige an der Oberfläche).

Beispielcode:

List<string> l1 = new List<string>(new string[] { "Foo", "Bar", "Baz" });
List<string> l2 = new List<string>(new string[] { "Foo", "Bar" });
List<string> diff = l1.Except(l2).ToList(); //diff enthält nun nur noch "Baz"

Edit: Ich muss meinen Lösungsvorschlag einschränken...Bei Enumerable.Except werden nur die Elemente zurückgegeben, die in l1, aber nicht in l2 enthalten sind. Elemente die in l2, aber nicht in l1 enthalten sind, werden nicht zurückgegeben!

Grüße, HiGHteK

D
Damlo Themenstarter:in
5 Beiträge seit 2014
vor 10 Jahren

DANKE!! @HiGHteK

dein Beitrag hat mir sehr geholfen!!

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo HiGHteK,

bezüglich deines Edits:

Die Elemente, die in l2, aber nicht in l1 enthalten sind, kann man auf die gleiche Weise ermitteln. Man muss nur die beiden Listen-Variablen vertauschen.

ich glaube der Beitrag bewegt sich hart an der Grenze zu einem Grundlagenbeitrag.

Ja, tut er. Und zwar in dem Sinne, dass jeder Programmierer, der die Grundlagen beherrscht, in der Lage sein sollte, einen Algorithmus zu schreiben, der im die Unterschiede liefert. ){gray}Wenn man es naiv angeht, dann sortiert man jede der beiden Listen und durchläuft sie anschließend synchron. Wenn man auf einen Unterschied stößt, weiß man automatisch, dass der kleinere Wert in der anderen Liste fehlt. Man überspringt diesen (kleineren) Wert und setzt den Vergleich fort. Wenn man am Ende einer der beiden Listen ankommen sind, fügt man alle noch nicht verarbeiteten Werte der anderen Liste zu den Unterschieden hinzu. Man kann währenden dieses Vorgehens natürlich auch eine Liste oder ein Dictionary entstellen, die bzw. das für jedes einzelne Element einen (Enum-)Wert enthält, der angibt, ob das Element nur in der ersten, nur in der zweiten oder in beiden Listen enthalten ist. Oder zwei gleichlange Listen, die jeweils dort null sind, wo das entsprechende Element nur in der andern Original-Liste fehlt. Oder ....

Ich lasse den Thread nur deshalb offen, damit bessere Vorschläge, die Unterschiede zu ermitteln, gepostet werden können.

Der Originaltitel war: "Datagridview ausgabe anpassen"

Ich habe den Titel geändert und den Thread in "Rund um die Programmierung" verschoben, weil aus den Nachfragen klar wurde, dass es in erster Linie darum ging, die Unterschiede zu ermitteln. Die Anzeige der Unterschiede in einem DataGridView sollte anschließend kein Problem darstellen und sollte daher hier bitte nicht weiter behandelt werden.

herbivore

H
114 Beiträge seit 2007
vor 10 Jahren

Hallo herbivore,

Die Elemente, die in l2, aber nicht in l1 enthalten sind, kann man auf die gleiche Weise ermitteln. Man muss nur die beiden Listen-Variablen vertauschen.

Danke für die ergänzende Anmerkung. Ich gebe zu das meine zusätzliche Bemerkung etwas unglücklich formuliert ist, aber genau darauf abzielen sollte. Ich ging auch einfach davon aus, dass das jedem klar sein sollte, spätestens beim Blick in die verlinkte Dokumentation 😉

Grüße, HiGHteK