LINQ VB, как проверить наличие дубликатов в списке объектов - PullRequest
1 голос
/ 12 октября 2011

У меня есть список объектов, каждый из которых имеет 2 соответствующих свойства: «ID» и «Имя». Давайте назовем список "lstOutcomes". Мне нужно проверить список на наличие дубликатов (что означает object1.ID = object2.ID и т. Д.) И установить флаг (valid = false, или что-то еще), если есть хотя бы один дубликат. Кроме того, было бы неплохо отправить пользователю сообщение с указанием «Имя» объекта, когда он выходит из строя.

Я уверен, что для этого мне понадобится оператор Group By, но я не привык делать это в LINQ, и приведенные здесь примеры просто не помогают мне. Эта статья , кажется, близка к тому, что мне нужно, но не совсем, и это в C #.

Вот начальный удар ...

Dim duplist = _
    (From o As objectType In lstOutcomes _
    Group o By o.ID Into g = Group _
    Let dups = g.Where(Function(h) g.Count > 1) _
    Order By dups Descending).ToArray

if duplist.count > 0 then
valid = false
end if

помощь

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Я напишу это в C #, но надеюсь, что вы сможете конвертировать его в VB.Он не использует соединение и имеет значение O (n log n), и я предположил, что у вас есть List<T>:

lst.Sort();  //O(nlogn) part.

var duplicatedItems = lst.Skip(1).Where((x,index)=>x.ID == lst[index].ID);
1 голос
/ 12 октября 2011

Проект позади, я просто взломал его так:

    ' For each outcome, if it is in the list of valid outcomes more than once, and it is not in the list of 
    ' duplicates, add it to the duplicates list.
    Dim lstDuplicates As New List(Of objectType)
    For Each outcome As objectType In lstOutcomes
        'declare a stable outcome variable
        Dim loutcome As objectType = outcome
        If lstOutcomes.Where(Function(o) o.ID = loutcome.ID).Count > 1 _
        AndAlso Not lstDuplicates.Where(Function(d) d.ID = loutcome.ID).Count > 0 Then
            lstDuplicates.Add(outcome)
        End If
    Next
    If lstDuplicates.Count > 0 Then
        valid = False
        sbErrors.Append("There cannot be multiple outcomes of any kind. The following " & lstDuplicates.Count & _
                        " outcomes are duplicates: ")
        For Each dup As objectType In lstDuplicates
            sbErrors.Append("""" & dup.Name & """" & " ")
        Next
        sbErrors.Append("." & vbNewLine)
    End If
1 голос
/ 12 октября 2011

Я возьму обратно то, что Саид Амири сказал в C #, и дополню его.

        lst.Sort()
        Dim valid As Boolean = true
    dim duplicatedItems = lst.Skip(1) _
        .Where(Function(x,index) x.ID = lst(index).ID)

    Dim count As Integer = duplicatedItems.Count()
    For Each item As objectType In duplicatedItems
        valid = False
        Console.WriteLine("id: " & item.ID & "Name: " & item.Name)
    Next
1 голос
/ 12 октября 2011
Dim itemsGroupedByID = lstOutcomes.GroupBy(Function(x) x.ID)
Dim duplicateItems = itemsGroupedByID.Where(Function(x) x.Count > 1) _
                                     .SelectMany(Function(x) x) _
                                     .ToList()

If duplicateItems.Count > 0
    valid = False
    Dim errorMessage = "The following items have a duplicate ID: " & _
                       String.Join(", ", duplicateItems.Select(Function(x) x.Name))
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...