vb.net - objetos - Buscar objeto en la lista genérica
list where vb net (4)
En general, necesitas usar predicados:
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)
O con métodos en línea:
Dim customerWithID1 As Customer = list.Find(Function(p) p.ID = 1)
¿Es posible buscar un objeto por una de sus propiedades en una lista genérica?
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
Luego cargando y buscando
Dim list as new list(Of Customer)
list.Add(New Customer(1,"A")
list.Add(New Customer(2,"B")
¿Cómo puedo devolver el objeto del cliente con id = 1? ¿Tiene esto que ver con el "Predicado" en Genéricos?
Nota: estoy haciendo esto en VB.NET.
Sí, esto tiene todo que ver con los predicados :)
Desea el método Find (Of T) . Necesita pasar un predicado (que es un tipo de delegado en este caso). Cómo construyes ese delegado depende de qué versión de VB estés usando. Si está utilizando VB9, podría usar una expresión lambda. (Si está utilizando VB9, es posible que desee utilizar LINQ en lugar de Buscar (De T), en primer lugar, tenga en cuenta). La forma de expresión lambda sería algo así como:
list.Find(function(c) c.ID = 1)
No estoy seguro si VB8 admite métodos anónimos de la misma manera que C # 2. Si necesita llamar a esto desde VB8, veré qué puedo hacer. (Soy más una persona C # realmente :)
Si está utilizando .NET 3.5, esto se puede hacer con LINQ to Objects :
Cómo: consultar una ArrayList con LINQ
Si no, en .NET 2.0 puede usar el método Find
de la lista .
La idea es que deberá proporcionar un método que devuelva verdadero si una propiedad de su objeto satisface una determinada condición.
También podría sobrecargar el método equals y luego hacer un contenedor. Me gusta esto
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"))
el método igual entonces se vería así
public overrides function Equals(Obj as object) as Boolean
return Me.Id.Equals(ctype(Obj,Customer).Id
end Function
No probado, pero debe ser lo suficientemente cerca.