2016-06-14 230 views
0

我想從基於公司ID的列表中刪除重複的對象。從VB.Net列表中刪除重複的對象

如何通過列表集成和刪除根據companyID的對象。

While reader.Read() 
      companys.Add(New CompanySearch) 
      companys(companys.Count - 1).StartDate = reader("StartDate").ToString & " (" & count & ")" 
      companys(companys.Count - 1).CompanyID = reader("company").ToString 
      companys(companys.Count - 1).Origin = reader("Origin").ToString 
      companys(companys.Count - 1).OriginName = reader("OriginName").ToString 
      companys(companys.Count - 1).Status = reader("status").ToString 
      companys(companys.Count - 1).StatusName = reader("statusname").ToString 
      companys(companys.Count - 1).Status = reader("status").ToString 
      companys(companys.Count - 1).FullLegalBusinessName = reader("fullLegalBusinessName") 
      companys(companys.Count - 1).AmountRequestedText = reader("amountRequestedText") 
      companys(companys.Count - 1).HowSoonNeededText = reader("howSoonNeededText") 
      companys(companys.Count - 1).QueueID = reader("QueueID") 
      companys(companys.Count - 1).Company = reader("Company") 
     End While 

For counter As Integer = 0 To companys.Count 
     counter += 1 
     If i <> CInt(companys(companys.Count - 1).CompanyID) Then 
      i = CInt(companys(companys.Count - 1).CompanyID) 
     Else 
      companys.Remove() 
     End If 
    Next 
+1

爲什麼不阻止其加入,而不是刪除它的? –

+0

因爲它來自的存儲的過程和儘可能SQL而言行它返回是不同 –

+0

檢查[這太問題](http://stackoverflow.com/questions/2322200/remove-duplicates-from-a-listof -t-在-VB網)。 Globaly,嘗試設置一個函數/類,您可以將其作爲參數傳遞給'.Distinct',以便您可以調用它並獲取刪除重複項的結果,例如'companys = companys.Distinct(New yourComparasionFunction).ToList'另一個選項(較慢)是迭代兩個循環 - 第一個通過你的列表,第二個在第一個內部完成,然後你比較兩個companyId的 –

回答

2

不要把它們放在第一位。在添加結果之前,使用Dictionary(如果您稍後將使用ID查找)或HashSet(如果您不會)檢查。下面是HashSet的例子:

Dim companyIDs As New HashSet(Of String)() 
While reader.Read() 
    If Not companyIDs.Contains(reader("company").ToString()) Then 
     companys.Add(New CompanySearch() With { 
      .StartDate = reader("StartDate").ToString() & " (" & count & ")", 
      .CompanyID = reader("company").ToString(), 
      .Origin = reader("Origin").ToString(), 
      .OriginName = reader("OriginName").ToString(), 
      .Status = reader("status").ToString(), 
      .StatusName = reader("statusname").ToString(), 
      .Status = reader("status").ToString(), 
      .FullLegalBusinessName = reader("fullLegalBusinessName"), 
      .AmountRequestedText = reader("amountRequestedText"), 
      .HowSoonNeededText = reader("howSoonNeededText"), 
      .QueueID = reader("QueueID"), 
      .Company = reader("Company"), 
     }) 
    End If 
    companyIDs.Add(reader("company").ToString()) 
End While 

我還注意到,在該對象的.Company.CompanyID屬性都被從讀者company柱填充。這是故意的,還是你的意思是看.CompanyID不同的列?

此外,雖然我理解你的現有搜索SQL已經認爲這些公司行作爲不同的,你應該回到繪圖板那裏,重新思考SQL,讓你真正做得到重複的記錄。也許可以使用嵌套查詢或CTE首先查找與您的查詢匹配的CompanyID值的投影,然後回到公司表以獲取每個公司的詳細信息,並在這些初始結果中包含ID。如果這是不可能的,你應該考慮它是什麼,讓行不同,因爲我答應你,一些列IS不同,如果你只是剔除一個記錄或其它你可能向用戶顯示錯誤的數據來自錯誤的行。

1

使用此:

Dim distinctCompanys = companys.GroupBy(Function(x) x.CompanyID).Select(Function(y) y.First()) 
0

您可以輕鬆地與LINQ過濾收集:

Dim companies = companys.Distinct(Function(c) c.CompanyID).ToList 

或者使用Dictionary(Of String, CompanySearch)代替,例如:

Dim companies As Dictionary(Of String, CompanySearch) 

While reader.Read() 
    Dim companyID = reader("company").ToString 
    companies(companyID) = New CompanySearch() With { 
     .StartDate = reader("StartDate").ToString & " (" & count & ")", 
     .CompanyID = companyID, 
     .Origin = reader("Origin").ToString, 
     .OriginName = reader("OriginName").ToString, 
     .Status = reader("status").ToString, 
     .StatusName = reader("statusname").ToString, 
     .Status = reader("status").ToString, 
     .FullLegalBusinessName = reader("fullLegalBusinessName"), 
     .AmountRequestedText = reader("amountRequestedText"), 
     .HowSoonNeededText = reader("howSoonNeededText"), 
     .QueueID = reader("QueueID"), 
     .Company = reader("Company") 
    } 
End While 

但我建議,而不是分組,以便以後可以檢查重複項目:

Dim companiesLookup = companys.ToLookup(Function(c) c.CompanyID) 

Dim duplicates = companiesLookup.Where(Function(c) c.Count > 1).ToList