2016-06-16 54 views
0

這是我第一次使用Datarows或表格數據。考慮到我有一個簡單的兩列表,一個包含ID,另一個包含名稱字符串。我需要做的是找到兩個具有相同ID的Datarows,並將這兩行傳遞給另一個函數,我們稱之爲HandleTheDuplicates在C中使用相同的id查找數據行#

此刻我試圖將以前的ID存儲在另一個變量中,並檢查它是否與當前ID相匹配,然後將其添加到DataRow類型的列表中。

List<DataRow> RowList = new List<DataRow>(); 
int previous = 0 ; 
foreach (DataRow rowToMatch in importSetOfTables.Tables["MyTable"].Rows) 
{ 
    int rowID = Convert.ToInt32(rowToMatch["ID"]);        
    if (previous == rowID) 
    { 
      RowList.Add(rowToMatch); 
    } 
    else 
    { 
      RowList.Clear(); 
    } 
    previous = rowID; 

    if(RowList.Count > 1) //in case of a match 
    { 
      HandleTheDuplicates(RowList); 
    } 
} 

我不知道這是做這種事情的正確方法,還是可能有更簡單的事情。

+2

這可以工作,但創建僅環,如果你的表是由ID – Steve

+0

排序爲什麼「別的RowList.Clear(); 「?你不想離開那裏的匹配行嗎? – jason44107

+1

感謝您的意見! Steve:如果表格沒有排序,那我該怎麼辦? 傑森:對不起,我應該更好地解釋,我將編輯問題 – agenthost

回答

1

LINQ是一個很好的選擇,在這裏:

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); 
} 

如果你想從原來的集合中刪除它們,另一個foreach循環可能的工作:(一般不要想從你迭代集合中刪除項目結束)

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

它看起來像每行都會匹配自己,如果你使用第一個代碼塊。另外,兩個不同行的每個匹配都會顯示兩次:一次是「行」是第一個匹配的行,一次是「行」是另一個匹配。這些都不一定是錯的;只是要注意的事情。 – jason44107

+0

好找!至於你的第一點,我不認爲它是一個問題,它會返回所有與之相匹配的行,包括它本身,是不是問題中的規範?你是對的,你不會想要比賽的副本,但可以用if中的另一個條件修復,我現在將編輯它。謝謝你的收穫! @ jason44107 –

1

如果您的DataTable按ID排序,那麼您的代碼就可以工作。可以肯定然後設置ID字段中的DataTable.DefaultView.Sort屬性,然後使用DataTable.DefaultView

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; 
}