2016-06-16 6 views
0

Es ist das erste Mal, dass ich mit Datenows oder Tabellendaten arbeite. Wenn ich eine einfache Tabelle mit zwei Spalten habe, enthält eine die ID und die andere eine Namensfolge. Was ich tun muss, ist, zwei Datenows mit der gleichen ID zu finden und diese zwei Zeilen an eine andere Funktion weiterzuleiten, nennen wir sie HandleTheDuplicates.Finden Sie Datenzeilen mit der gleichen ID in C#

Im Moment versuche ich die vorherige ID in einer anderen Variablen zu speichern und zu prüfen, ob diese mit der aktuellen ID übereinstimmt und sie dann zu einer Liste vom Typ DataRow hinzufügen.

Ich weiß nicht, ob dies der richtige Weg ist, etwas zu tun oder wenn es etwas einfacher sein könnte.

+2

Diese Arbeit könnte aber nur, wenn Sie Ihre Tabelle nach ID sortiert – Steve

+0

Warum „else RowList.Clear(); "? Würdest du nicht die passenden Reihen da drin lassen wollen? – jason44107

+1

Danke für Ihre Kommentare! Steve: Wenn die Tabelle nicht sortiert ist, was kann ich tun? Jason: Sorry, ich hätte besser erklären sollen, ich werde die Frage bearbeiten – agenthost

Antwort

1

LINQ ist eine gute Wahl hier:

List<DataRow> RowList = new List<DataRow>(); 

foreach (DataRow row in importSetOfTables.Tables["MyTable"].Rows) 
{ 
    // Use LINQ to get a list of rows matching on ID 
    List<DataRow> matches = (from t in importSetOfTables.Tables["MyTable"].Rows 
          where row.ID == t.ID 
          select a).ToList(); 
    // Insert matching rows into your collection 
    if (matches.Count() > 0) 
     if (!(RowList.Contains(matches[0])) 
      RowList.AddRange(matches); 
} 

Wenn man sie aus der ursprünglichen Sammlung entfernen möge, könnte eine weitere foreach-Schleife arbeiten: (In der Regel will keine Elemente aus einer Sammlung entfernen Sie iterieren über)

foreach(DataRow row in RowList) 
{ 
    if (importSetOfTables.Tables["MyTable"].Rows.Contains(row)) 
     importSetOfTables.Tables["MyTable"].Rows.Remove(row); 
} 
+0

Es sieht aus wie jede Zeile wird sich selbst übereinstimmen, wenn Sie diesen ersten Codeblock verwenden. Außerdem wird jede Übereinstimmung von zwei verschiedenen Zeilen zweimal angezeigt: einmal, wenn "Zeile" die erste übereinstimmende Zeile ist, und einmal, wenn "Zeile" die andere Übereinstimmung ist. Keines davon ist notwendigerweise falsch; nur etwas zu beachten. – jason44107

+0

Gut finden! So weit wie Ihr erster Punkt, ich sehe es nicht als ein Problem, Es wird alle Zeilen, die dazu passen, einschließlich sich selbst zurückgeben, ist das nicht die Spezifikation in der Frage? Du hast Recht, dass du keine Kopien des Spiels haben möchtest, die mit einer anderen Bedingung im if behoben werden können, die ich jetzt bearbeiten werde. Danke für den Fang! @ jason44107 –

1

Ihr Code könnte funktionieren, wenn Sie die DataTable nach ID sortiert haben. Um sicher zu gehen, dann stellen Sie die DataTable.DefaultView.Sort Eigenschaft auf dem ID-Feld und dann erstellen Sie Ihre Schleife die DataTable.DefaultView mit

List<DataRow> RowList = new List<DataRow>(); 
int previous = 0 ; 
importSetOfTables.Tables["MyTable"].DefaultView.Sort = "ID"; 
foreach (DataRowView rw in importSetOfTables.Tables["MyTable"].DefaultView) 
{ 
    int rowID = Convert.ToInt32(rw["ID"]); 
    if (previous == rowID) 
      RowList.Add(rw.Row); 
    else 
    { 
      // Call the function that handles the duplicates 
      if(RowList.Count > 1) 
      HandleTheDuplicates(RowList); 
      RowList.Clear(); 
    } 
    previous = rowID; 
} 
Verwandte Themen