2016-06-14 3 views
0

Я пытаюсь удалить дублированный объект из списка на основе идентификатора компании.Удалить дубликаты объектов из списка в VB.Net

Как интегрировать в список и удалить объект на основе идентификатора компании.

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

Проверьте [этот вопрос SO] (http://stackoverflow.com/questions/2322200/remove-duplicates-from-a-listof -t-в-VB-нетто). Globaly, попытайтесь установить функцию/класс, которую вы можете передать как параметр '.Distinct', чтобы вы могли вызвать его и удалить дубликаты, ваш результат может быть похож на' companys = companys.Distinct (New yourComparasionFunction) .ToList' Еще один вариант (медленнее) состоит в повторении с двумя циклами - первый проходит через ваш список, а второй делает то же самое внутри 1-го, а затем вы сравниваете –

ответ

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, которые соответствуют вашему запросу, а затем присоединиться к таблице вашей компании, чтобы получить информацию для каждой компании с идентификатором, включенным в эти исходные результаты. Если это невозможно, вы должны подумать о том, что это такое, что делает строки разными, потому что я обещаю вам, что какой-то столбец 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 
Смежные вопросы