• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

List(Of ) IEquatable e Predicate

7 mensagens neste tópico

É o seguinte, estava a usar o que aprendi no blog do jpaulino sobre estes métodos e construí esta classe

Public Class Computer
        Implements IEquatable(Of Computer)

        Public Id As String
        Public Name As String
        Public Ip As String

        Public Function FindPC(ByVal PCname As Computer) As Boolean Implements System.IEquatable(Of Computer).Equals
            Return Me.Name = PCname.Name
        End Function

        Public Function FindPCip(ByVal PCip As Computer) As Boolean Implements System.IEquatable(Of Computer).Equals
            Return Me.Ip = PCip.Ip
        End Function
    End Class

Que funcionava muito bem até eu ter adicionado a Public Function FindPCip que iria me servir para pesquisar por um Computador mas pelo seu IP e não pelo NOME.

Mas está a dar erro aqui

Implements System.IEquatable(Of Computer).Equals

Cannot implement 'System.IEquatable(Of Computer).Equals' because its implementation could conflict with the implementation for 'System.IEquatable(Of Computer).Equals' for some type arguments.

Só podemos ter um tipo de pesquisa? Eu dava-me muito jeito ter os dois tipos, procurar tanto pelo nome como pelo IP.

EDIT: Alterado titulo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Só agora deu para responder!  :(

Bem tu não entendeste bem a ideia. Como tens uma estrutura, podes através desse método procurar qualquer elemento na lista, e só tens de especificar na função (neste caso FindPC), o que queres procurar.

Pode exemplo, tens a classe:

Public Class Computer
    Implements IEquatable(Of Computer)

    Public ID As Int16
    Public Name As String
    Public Ip As String


    Public Function FindPC(ByVal PCname As Computer) As Boolean Implements System.IEquatable(Of Computer).Equals
        If Me.Name = PCname.Name OrElse Me.ID = PCname.ID OrElse Me.Ip = PCname.Ip Then
            Return True
        Else
            Return False
        End If
    End Function

End Class

Depois adicionas alguns items a lista, do tipo Computer:

        Dim ComputerList As New List(Of Computer)

        Dim c As Computer = Nothing
        For x As Byte = 1 To 30
            c = New Computer
            c.ID = x
            c.Name = "Dell " & x.ToString
            c.Ip = "127.0.0." & x.ToString
            ComputerList.Add(c)
        Next

Finalmente na pesquisa, precisas apenas de indicar os campo que queres pesquisar:

        Dim ToFind As New Computer With {.Name = "Dell 4"}
        Dim result As Computer = ComputerList.Find(New Predicate(Of Computer)(AddressOf ToFind.FindPC))
        If result IsNot Nothing Then
            Debug.WriteLine("Este PC tem o ID: " & result.ID)
        Else
            Debug.WriteLine("Pc não encontrado!")
        End If

Podes também usar LINQ e com uma pesquisa directa:

Dim linqResult = From computerResult As Computer In ComputerList Where computerResult.Name = "Dell 4"

Espero que tenhas compreendido e seja isto que estás à procura!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que agora percebi.

Só uma questão, porque é que agora usa  Return True e antes era Return Me.Name = PCname.Name  :dontgetit:

Edit: Já está a funcionar 5 estrelas e acho que já percebi o porque do True ou False retorna true caso encontre uma correspondência ou false para o caso contrário.

Mas no 1º exemplo porque o Return Me.Name = PCname.Name ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O resultado da função é booleano e Me.Name = PCname.Name  (no caso verdadeiro) também dá um resultado booleano. É isso que faz sair da função.

No entanto é mais simples de entender, e talvés mais correcto, usar o Return True ou Return False, especialmente quando tens mais campos para pesquisar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado!

O LINQ está muito interessante, não sabia que também dava para o usar para pesquisar, no caso do LINQ já nem era necessário aquela Funcção ou era?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O LINQ está muito interessante, não sabia que também dava para o usar para pesquisar, no caso do LINQ já nem era necessário aquela Funcção ou era?

Não, usando o LINQ (to Objects) o resultado é pesquisado directamente na lista e fica logo na variável.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora