VB.Net, как использовать .FindAll в объекте List (of)? - PullRequest
0 голосов
/ 27 июня 2011

Я пытался использовать метод .ind () и был успешно. Но я не могу понять, как работать с FindAll, чтобы получать все элементы, соответствующие «гибкому» ключевому слову (в моем случае это ключевое слово называется ClassGuid).

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

Как это можно использовать?

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Используйте лямбда-выражение для передачи второго параметра:

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

РЕДАКТИРОВАТЬ, чтобы ответить на ваш комментарий:

FindAll занимает Predicate(Of T) (Predicate(Of PropertyConnection) в вашем случае), поэтому вы не можете передать ему ConMatchDelegate, так как подпись несовместима. Поэтому я создаю Predicate(Of PropertyConnection), используя анонимный метод. Это, вероятно, будет более понятно:

Dim filter As Predicate(Of PropertyConnection) = Function(con) ConnectionFromMatch(con, ClassGuid)
Res = LBaseConnections.FindAll(filter)
0 голосов
/ 27 июня 2011

Извините, я парень на C #, но я надеюсь, что мы сможем поделиться концепцией здесь.

FindAll метод класса List принимает Predicate .Предикат - это специализированный делегат, который принимает один параметр и возвращает логическое значение.Таким образом, FindAll внутренне выполняет итерацию каждого элемента в списке, и какой элемент соответствует условию, определенному в предикате, будет включен в результат.

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...