2008-10-14 8 views
12

Est-il possible de rechercher un objet par l'une de ses propriétés dans une liste générique?Rechercher un objet dans la liste générique

Public Class Customer 

    Private _id As Integer 

    Private _name As String 

    Public Property ID() As Integer 
     Get 
      Return _id 
     End Get 
     Set 
      _id = value 
     End Set 
    End Property 

    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set 
      _name = value 
     End Set 
    End Property 

    Public Sub New(id As Integer, name As String) 
     _id = id 
     _name = name 
    End Sub 

End Class 

Puis le chargement et la recherche

Dim list as new list(Of Customer) 

list.Add(New Customer(1,"A") 

list.Add(New Customer(2,"B") 

Comment puis-je retourner l'objet client id = 1? Est-ce que cela a à voir avec le "prédicat" dans les génériques?

Remarque: Je le fais dans VB.NET.

Répondre

19

Oui, cela a tout à voir avec prédicats :)

Vous voulez que la méthode Find(Of T). Vous devez transmettre un prédicat (qui est un type de délégué dans ce cas). La façon dont vous construisez ce délégué dépend de la version de VB que vous utilisez. Si vous utilisez VB9, vous pouvez utiliser une expression lambda. (Si vous utilisez VB9 vous voudrez peut-être utiliser LINQ au lieu de trouver (Of T) en premier lieu, vous l'esprit.) La forme d'expression lambda serait quelque chose comme:

list.Find(function(c) c.ID = 1) 

Je ne suis pas sûr si VB8 prend en charge les méthodes anonymes de la même manière que C# 2. Si vous avez besoin de l'appeler à partir de VB8, je verrai ce que je peux trouver. (Je suis plus d'une personne C# vraiment :)

+0

J'utilise VB9 On 2.0 et non 3.5 sur ce projet :(Je vais donner une chance à l'expression lambda Merci –

+0

Si vous utilisez VB9 mais limité à .NET 2.0, vous pouvez regarder LINQBridge : http://www.albahari.com/nutshell/linqbridge.aspx Il s'agit essentiellement d'une implémentation LINQ to Objects ciblant .NET 2.0. –

+0

Merci pour un exemple de fonction de prédicat à une ligne. – TWood

7

En général, vous devez utiliser prédicats:

list.Add(New Customer(1, "A")) 
list.Add(New Customer(2, "B")) 

Private Function HasID1(ByVal c As Customer) As Boolean 
    Return (c.ID = 1) 
End Function 

Dim customerWithID1 As Customer = list.Find(AddressOf HasID1) 

Ou avec des méthodes inline:

Dim customerWithID1 As Customer = list.Find(Function(p) p.ID = 1) 
1

Vous pouvez également surcharger la méthode equals et puis faites un contenant. comme celui-ci

Dim list as new list(Of Customer) 

list.Add(New Customer(1,"A") 

list.Add(New Customer(2,"B") 

list.contains(new customer(1,"A")) 

la méthode equals doit ressembler à ce

public overrides function Equals(Obj as object) as Boolean 
    return Me.Id.Equals(ctype(Obj,Customer).Id 
end Function 

Non testé, mais il devrait être assez proche.

Questions connexes