Entwickler-Ecke
Basistechnologien - Doppeleinträge löschen
dinazavric - Fr 29.04.11 14:03
Titel: Doppeleinträge löschen
Im Internet habe ich ein Beispiel gefunden wie ich anhand von Hashtable die doppelten Einträge aus einer DataTable löschen kann.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Hashtable hashTable1 = new Hashtable(); string columnName1 = "ProtocolID"; List<DataRow> duplicateList1 = new List<DataRow>();
foreach (DataRow dataRow in dataSetPro.Tables["Protocols"].Rows) try { hashTable1.Add(dataRow[columnName1], string.Empty); } catch { duplicateList1.Add(dataRow); } foreach (DataRow dataRow in duplicateList1) dataSetPro.Tables["Protocols"].Rows.Remove(dataRow); |
Ich habe ein DataSet mit zwei DataTables und möchte nicht nur anhand von einem Element die Daten löschen, wie es im Code oben gemacht wurde. Das würde gehen, wenn ich nur zwei Spalten habe. Das gilt bei mir eben nür für eine Tabelle. Die andere beinhaltet Parameter, die die einzelnen Protocole aus der ersten Tabelle beschreiben. In dem Fall möchte ich nicht nur die Einträge aus der zweiten Tabelle löschen, die gleiche IDs haben, da es durchaus möglich ist, sondern nur die, die kommplet gleich sind oder sich nur in der dritten Zeile unterscheiden. Hier ein Beispiel:
Table Protocols:
p1
p2
p3
Table Parameters
p1 n1 12
p1 n2 33
p1 n2 33
p2 n1 11
p3 n2 12
p3 n2 10
In diesem Beispiel solltel die Zeilen 3 und 6 gelöscht werden, da sie entweder gleich sind oder den gleichen Parameter (hier n2) mit zwei Values (hier 12 und 10) beschreiben. Beim letzten Eintrag soll der ältere Eintrag gelöscht werden. Wie kann man sowas realisieren?
IsNull - Fr 29.04.11 14:22
Nutze Distinct(), dem du einen custom EqualityComparer spendierst.
Der EqualityComparer muss dann einfach die ersten beiden Spalten (Felder) vergleichen, da das dritte Feld ja unterschiedlich sein darf.
dinazavric - Fr 29.04.11 15:36
OK :-)
dinazavric - Mo 02.05.11 09:35
IsNull hat folgendes geschrieben : |
Nutze Distinct(), dem du einen custom EqualityComparer spendierst.
Der EqualityComparer muss dann einfach die ersten beiden Spalten (Felder) vergleichen, da das dritte Feld ja unterschiedlich sein darf. |
So wie ich verstanden habe, kann man Distinct() nicht direct für DataSets, bzw. DataTables benutzen, sondern das ganze über Arrays programmieren?
dinazavric - Mo 02.05.11 10:38
Ich habe keine Datenbank o.Ä., ich benutze ein nicht typisiertes DataSet mit wenig Daten. Wäre es mit LINQ to DataSet nicht etwas zu groß für so eine Aufgabe? Gibt es nicht etwas Ähnliches wie Distinct() für DataTables? Alle Beispiele, die ich im Internet gefunden habe machen eine Suche in einer DataTable und erstellen dann eine neue mit den Zeilen, die ein Feld gleich haben. Ich möchte aber aus meiner Tabelle die Zeilen löschen, die zwei Felder aus drei gleich haben.
dinazavric - Mo 02.05.11 10:52
Ich habe jetzt ein Beispiel gefunden, das mir, meiner Meinung nach, mit meinem Problem weiter helfen könnte. Nur habe ich etwas Schwierigkeiten diesen Code auf Sucher für gleichzeitig zwei Felder zu erweitern und ganau diese Zeilen aus meiner bestehenden DataTable zu löschen. Kann mir da jemand helfen? Hier ist der Code dazu:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| public static DataTable GetDistinct(string table, DataTable source, string field) { DataTable newDT = new DataTable(table);
newDT.Columns.Add(field, source.Columns[field].DataType);
DataRow[] rows = source.Select("", field);
object value = null;
foreach (DataRow row in rows) { if (value == null || !(AreEqual(value, row[field]))) { value = row[field]; newDT.Rows.Add(new object[] { value }); } } return newDT; }
private static bool AreEqual(object obj1, object obj2) { if (object.ReferenceEquals(obj1, DBNull.Value) & object.ReferenceEquals(obj2, DBNull.Value)) return true; if (object.ReferenceEquals(obj1, DBNull.Value) | object.ReferenceEquals(obj2, DBNull.Value)) return false;
return obj1 == obj2; } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!