2016-06-14 227 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