[VB2005] List(Of T).Find... che utilità ha per come è strutturato?

venerdì 20 novembre 2009 - 10.56

Teech Profilo | Expert

Ho controllato su MSDN come utilizzare il metodo Find (stesso discorso vale per FindAll, Exist, ecc...) della classe List Generica e ho un forte dubbio sulla reale utilità del metodo stesso...
http://msdn.microsoft.com/it-it/library/x0b5b5bc.aspx

Vedo che nel Delegate utilizzato come predicato il valore di confronto è "hard coded" (nell'esempio la stringa "saurus"), mentre io vorrei utilizzare una variabile (e non credo di chiedere la luna)... Ad esempio ho degli oggetti istanziati di tipo "Person" inseriti nella List generica e vorrei controllare se un determinato Person è presente verificando la proprietà "Codice" dell'oggetto: la proprietà codice però è una variabile...

Public Sub FindPerson(ByVal p as Person) Dim p1 As New Person(1,"Pippo") Dim p2 As New Person(2,"Pippo") Dim p1 As New Person(3,"Pippo") Dim persons as New List(Of Person) persons.Add(p1) persons.Add(p2) persons.Add(p3) persons.Find(AddressOf FindPersonByCode) '<--- Come passo l'oggetto 'p' End Sub Private Function FindPersonByCode(ByVal person As Person) As Boolean If person.Codice=p.Codice Then '<---Dove riceve l'oggetto 'p' Return True Else Return False End If End Function
Esiste una soluzione per parametrizzare il parametro di confronto? Ho pensato ad una variabile a livello di classe, ma mi sembra una forzatura a livello logico...

Che ne pensate?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao

Puoi usare la nuova sintassi per le lambda expressions:

Function FindPersonByCode(ByVal persons As List(Of Person), ByVal code As Integer) As Person Return persons.Find(Function(that As Person) (that.Code = code)) End Function

Luca

Teech Profilo | Expert

Ho provato a sbatterci un pò la testa, ma utilizzando il framework 2.0 non credo di poter utilizzare le lambda expressions
Sicuramente è un ulteriore incentivo per passare prossimamente al framework 3.5 ma per ora non ne ho la possibilità...

Altre strade percorribili?
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Allora devi fare una cosa un po' più sporca (che in realtà è la stessa cosa che fa il compilatore quando usi una Lambda Expression)

Crei una classe che contenga tutte le variabili che ti servono all'interno del metodo di ricerca, e la funzione che fa i controlli. Quindi, ad esempio, una cosa come questa:

Class PersonFinder ' Il codice della persona da cercare Dim code As Integer Public Sub New(ByVal code As Integer) Me.code = code End Sub ' Questa funzione controlla che il codice di '"arg" sia uguale a quello che stiamo cercando Public Function FindByCode(ByVal arg As Person) As Boolean If arg.Code = code Then Return True Else Return False End If End Function End Class

Quindi, quando devi usare il metodo Find, istanzi un oggetto di tipo PersonFinder, imposti il codice della persona da trovare e quindi usi come delegato il metodo della classe PersonFinder, in questo modo:

Function FindPersonByCode(ByVal persons As List(Of Person), ByVal code As Integer) As Person Dim finder As New PersonFinder(code) Return persons.Find(AddressOf finder.FindByCode) End Function

Luca

Teech Profilo | Expert

Da delle ricerche che ho fatto sembra essere l'applicazione dello Strategy Pattern... Mi piace molto come soluzione!!!
Ora proverò ad adattare questo codice su una classe Generica utilizzando le PropertyInfo ed il gioco è fatto.

Grazie mille!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5