2011-06-27 2 views
0

J'ai essayé d'utiliser la méthode .Find() et j'ai réussi. Mais je ne peux pas comprendre comment travailler avec FindAll pour recevoir tous les éléments correspondant à un mot-clé "flexible" (dans mon cas, ce mot-clé s'appelle ClassGuid).VB.Net comment utiliser .FindAll dans un objet List (of)?

Public Class clsFindConnection 
Private Delegate Function ConMatchDelegate(ByVal con As PropertyConnection, ByVal ClassGuid As String) As Boolean 



    Public Function GetPropertyConnectionsByGuid(ByVal ClassGuid As String, ByVal LBaseConnections As List(Of PropertyConnection)) As List(Of PropertyConnection) 
     Dim Res As List(Of PropertyConnection) 
     Dim dl As New ConMatchDelegate(AddressOf ConnectionFromMatch) 
     Res = LBaseConnections.FindAll(dl)'<-- ERROR. Can not work because delegate is only using a single item. 
     Return Res 
    End Function 

    Friend Function ConnectionFromMatch(ByVal con As PropertyConnection, ByVal ClassGuid As String) As Boolean 
     If con.PaintPluginFrom Is Nothing Then Return False 
     If con.PaintPluginFrom.Plugin Is Nothing Then Return False 
     If con.PaintPluginFrom.Plugin.Guid = ClassGuid Then Return True 
     Return False 
    End Function 
End Class 

Comment cela peut-il être utilisé?

Répondre

2

Utilisez une expression lambda pour passer le second paramètre:

Res = LBaseConnections.FindAll(Function(con) ConnectionFromMatch(con, ClassGuid)) 

EDIT pour répondre à votre commentaire:

FindAll prend un Predicate(Of T) (Predicate(Of PropertyConnection) dans votre cas), de sorte que vous ne pouvez pas passer un ConMatchDelegate à lui, puisque la signature n'est pas compatible. Donc, je crée un Predicate(Of PropertyConnection) en utilisant une méthode anonyme. Ce sera probablement plus compréhensible:

Dim filter As Predicate(Of PropertyConnection) = Function(con) ConnectionFromMatch(con, ClassGuid) 
Res = LBaseConnections.FindAll(filter) 
+0

Merci. Et ça fonctionne comme un charme. Mais je ne comprends pas pourquoi. Est-il possible de le réécrire avec plus de description ou avec un délégué au lieu de l'expression lamnda ou avec quelques commentaires dans votre ligne? – Nasenbaer

+0

@Nasenbaer, voir ma réponse éditée –

0

Désolé, je m un gars C#, mais j'espère que nous pourrons partager un concept ici.

FindAll La méthode de la classe List prend un Prédicat. Predicate est un délégué spécialisé qui prend un seul paramètre et renvoie une valeur booléenne. Ainsi, FindAll fait en interne l'itération de chaque élément de la liste et quel élément répond à la condition définie dans le prédicat, sera inclus dans le résultat.

class Program 
    { 
     static void Main(string[] args) 
     { 
      List<PropertyConnection> lstConn = new List<PropertyConnection>(){ 
                new PropertyConnection() { Id = 10}, 
                new PropertyConnection() { Id = 20 }, 
                new PropertyConnection() { Id = 30 } }; 

      List<PropertyConnection> filtered = lstConn.FindAll(MyDelegate); 
      // so filtered contains just one item with Id = 30 
     } 

     private static bool MyDelegate(PropertyConnection con) // your own delegate 
     { 
      if (con.Id > 20) 
       return true; 
      else 
       return false; 
     } 
    } 

    public class PropertyConnection // sample class 
    { 
     public int Id; 
    } 
+0

Salut Santoo. Je vois toujours le même problème. Comment soumettre une "variable" à MyDelegate? Thomas Levesque a déjà répondu avec une solution d'expression lambda qui fonctionne. Mais là je ne comprends pas complètement pourquoi. Merci de votre aide. – Nasenbaer

Questions connexes