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"
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++;
}
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.
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 😃
Hallo Damlo,
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
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.
Den Umgang mit den grundlegenden Collections setzen wir als bekannt voraus. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 (und 4a).
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
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?
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
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
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