2010-04-16 28 views
9

Tener un poco de problemas con el List.Find con un predicado encargoVB.Net List.Find. Pasar valores de predicado

Tengo una función que hace esto

private function test() 
    Dim test As Integer = keys.Find(AddressOf FindByOldKeyAndName).NewKey 

aquí está la función para el predicado

Private Shared Function FindByOldKeyAndName(ByVal k As KeyObj) As Boolean 
     If k.OldKey = currentKey.OldKey And k.KeyName = currentKey.KeyName Then 
      Return True 
     Else 
      Return False 
     End If 


    End Function 

haciéndolo de esta manera significa que tengo que tener un objeto "currentKey" compartido en la clase, y sé que tiene que haber una forma de pasar los valores que me interesan de CurrentKey (es decir, keyname y oldkey)

Idealmente me gustaría llamarlo por algo así como keys.Find(AddressOf FindByOldKeyAndName(Name,OldVal))

sin embargo cuando hago esto me da errores de compilación.

¿Cómo llamo a este método y paso los valores?

Respuesta

22

Puede resolver esto limpiamente con una expresión lambda, disponible en VS2008 en adelante. Un ejemplo tonto:

Sub Main() 
    Dim lst As New List(Of Integer) 
    lst.Add(1) 
    lst.Add(2) 
    Dim toFind = 2 
    Dim found = lst.Find(Function(value As Integer) value = toFind) 
    Console.WriteLine(found) 
    Console.ReadLine() 
End Sub 

Para versiones anteriores que tendrá que hacer "currentKey" un campo privado de su clase. Verifique mi código en this thread para obtener una solución limpiadora.

2

No he necesitado probar esto en las versiones más nuevas de VB.Net que podrían tener una forma más agradable, pero en versiones anteriores, la única forma que conozco sería tener un miembro compartido en su clase para establecer con el valor antes de la llamada.
Hay varias muestras en la red de personas que crean pequeñas clases de utilidad para completar esto y hacerlo un poco más agradable.

4

Tengo un objeto que administra una lista de tipos de propiedades únicas. Ejemplo:

obj.AddProperty(new PropertyClass(PropertyTypeEnum.Location,value)) 
obj.AddProperty(new PropertyClass(PropertyTypeEnum.CallingCard,value)) 
obj.AddProperty(new PropertyClass(PropertyTypeEnum.CallingCard,value)) 
//throws exception because property of type CallingCard already exists 

Aquí hay un código para comprobar si las propiedades ya existen

Public Sub AddProperty(ByVal prop As PropertyClass) 
    If Properties.Count < 50 Then 
     'Lets verify this property does not exist 
     Dim existingProperty As PropertyClass = _ 
      Properties.Find(Function(value As PropertyClass) 
       Return value.PropertyType = prop.PropertyType 
      End Function) 

     'if it does not exist, add it otherwise throw exception 
     If existingProperty Is Nothing Then 
      Properties.Add(prop) 
     Else 
      Throw New DuplicatePropertyException("Duplicate Property: " + _ 
         prop.PropertyType.ToString()) 
     End If 

    End If 
End Sub 
Cuestiones relacionadas