首页 > 解决方案 > 如何创建一个布尔函数来列出通用集合中的对象?

问题描述

创建一个之后List(Of T),我想创建一个Boolean函数。首先,我们将要求数据在列表中添加一个对象。但是,如果这个新对象具有相同的“DNI”(来自 Aspirante 类的字符串属性),那么我们不能将这个新对象包含在列表中。因此,应该是True当我们有一个具有相同属性的对象时,False当我们没有时,我们可以添加新对象。

下面是我做的代码:

Public Class Oposicion

        Private datos As New List(Of Aspirante)()
     

        Public Function Alta(ByRef objAspirante As Aspirante) As Boolean


            If datos.Contains(objAspirante.DNI) Then
               

                Return True

            Else

                datos.Add(objAspirante)

                Return False
            End If
        End Function



End Class

然而它不起作用。我不知道该怎么做。对不起,如果我不够清楚。

标签: vb.net

解决方案


这不会直接回答您的问题,但它涉及大量代码,因此无法在评论中使用。

您可能一开始就不应该使用 a List(Of T)HashSet(Of T)已经包含防止添加重复项目的功能,因此这可能是一个更好的选择。如果要比较特定属性值上的对象,则需要首先基于该值创建一个比较器:

Public Class Thing

    Public Property Stuff As String

End Class


Public Class ThingComparer
    Implements IEqualityComparer(Of Thing)

    Public Overloads Function Equals(x As Thing, y As Thing) As Boolean Implements IEqualityComparer(Of Thing).Equals
        Return x.Stuff.Equals(y.Stuff)
    End Function

    Public Overloads Function GetHashCode(obj As Thing) As Integer Implements IEqualityComparer(Of Thing).GetHashCode
        Return obj.GetHashCode()
    End Function

End Class

然后,您创建一个HashSet(Of T)使用该比较器来确定相等性的:

Dim things As New HashSet(Of Thing)(New ThingComparer)

然后,您可以通过调用添加您喜欢的项目Add。这将添加新项目并返回True,或者不会添加重复项目并返回False

Dim variousStuff = {"One", "Two", "One"}

For Each stuff In variousStuff
    Dim something As New Thing With {.Stuff = stuff}

    If things.Add(something) Then
        Console.WriteLine($"'{stuff}' was added successfully.")
    Else
        Console.WriteLine($"'{stuff}' is a duplicate and was not added.")
    End If
Next

潜在的缺点是它HasSet(Of T)没有实现IList(Of T),所以你不能通过索引访问项目。它确实实现ICollection(OF T)了,所以它确实有一个Count属性,你可以用For Each循环枚举它。


推荐阅读