Conversione c# to Vb.Net

venerdì 06 febbraio 2009 - 13.11

MagoDaniel1981 Profilo | Newbie

Buongiorno a tutti!
sono nuovo di questo forum, percui spero che comunque qualcuno vorrà darmi una mano. Sto cercando di imbastire un progetto utilizzando il pattern del 3-tier in una web application sviluppata in asp.net con vb come linguaggio. ho trovato un fantastico esempio su html.it che sto seguendo per quanto riguarda l'organizzazione del DOM dell'applicazione.
Solo che ora sono incappato in una semplice funzione, che da una collection ne restituisce un determinato elemento grazie all'id. Solo che l'esempio e in c# ed io lo mastico proprio poco, non riesco a farne la traspozione in Vb, anche perchè non essendo molto avvezzo ai Generic non so esattamente cosa vuol fare la funzione. Nell'esempio si parla di recuperare un POST di un Blog da una collection di Post...

Questo il codice:

public Post GetByID(int postID) { return ((List<Post>)Items).Find( delegate(Post item) { return item.ID.Equals(postID); }); }
Immagino sia una function, giusto? in c# non si sua public function a quanto vedo.... Ma ora, come devo riscrivere quella riga: Return((List<Post>)Items.find.... e via dicendo in Visual Basic .NET?

Grazie a chiunque vorrà essermi d'aiuto e scusate il disturbo!


Daniel


____________________________
Ho trovato su un sito che dovrebbe fare da convertitore c# 2 vb.net questa trasformazione, ma ovviamente mi marca la parola function come errore....

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Che devo fare???? Come mai?
Help me please!

Daniel
_________________________________________________

Scusate ancora, perchè intanto ci sto picchiando la testa... così risolvo, giusto? però non è la stessa cosa, o si?

Public Function GetByID(ByVal personaID As Integer) As Persona For Each p As Persona In Me.Items If p.ID.Equals(personaID) Then Return p Exit Function Else Return Nothing Exit Function End If Next Return Nothing End Function

Sostanzialmente, nell'altro modo, si tratterebbe di creare una funzione ad hoc che viene chiamata dal delegato, ho capito bene?

Grazie ancora a chi vorrà essermi d'aiuto!

Daniel

rossimarko Profilo | Guru

Ciao,

si con l'ultima versione risolvi. In pratica ricerchi un elemento filtrando per il suo id. L'exit funcion non serve, la return esce automaticamente.

Il problema è che in c# inserire il delegato direttamente in linea è possibile in vb.net no, dovresti creare una funzione a parte:

Public Function GetID(ByVal postID As Integer) As Post Return DirectCast(items, List(Of Post)).Find(AddressOf SearchDelegate) End Function Public Function SearchDelegate(ByVal item As Post) As Boolean Return item.ID.Equals(1) End Function
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

MagoDaniel1981 Profilo | Newbie

CIao Marco, intanto grazie per l'interessamento!

Perfetto, avevo capito che dovevo creare una seconda funzione, ma quel che non mi è chiaro è quanto segue:
tu, nella funzione di esempio che hai creato, cerchi un ipotetico ID ugugale a 1. Ma se invece dovessi passare l'id che invio alla prima funzione, come faccio?
Capito cosa intendo? Dovrei passare, ad ogni ciclo, l'elemento (in questo caso Post, nel mio si tratta di una classe Persona) ed inoltre l'id con il quale deve matchare giusto?
Come farei, con due parametri nella funzione SearchDelegate?

Grazie infinitamente e buon lavoro.

Daniel

rossimarko Profilo | Guru

Ciao,

purtroppo con vb.net l'unico modo è mettere il parametro in una variabile visibile sia dal delegato che dalla funzione che richiama il find.

Qualcuno altrimenti crea una classe apposta: http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/bad5193a-3bf1-4675-8a05-625f46f9c158/ con il parametro di ricerca e il delegato
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

MagoDaniel1981 Profilo | Newbie

Ok perfetto, ancora 1000 grazie! un'ultima domanda che mi sorge dall'aver provato ad implementare quanto suggerito nel post...

ora ho:

Public Class PersonaCollection Inherits System.Collections.ObjectModel.Collection(of Persona) Public Function GetByProviderUserKey(ByVal personaProviderUserKey As Guid) As Persona Dim comparatore As New MyBusinessObjectPredicate(personaProviderUserKey) Return DirectCast(Items, List(Of Persona)).Find(AddressOf comparatore.CompareKeys) End Function End Class Public Class MyBusinessObjectPredicate Private _providerUserKey As Guid Private _id As Integer Public Sub New(ByVal key As Guid) _providerUserKey = key End Sub Public Sub New(ByVal id As Integer) _id = id End Sub Public Function CompareKeys(ByVal obj As Persona) As Boolean Return (_providerUserKey = obj.ProviderUserKey) End Function Public Function CompareId(ByVal obj As Persona) As Boolean Return (_id = obj.ID) End Function

Ma la domanda è: perchè la riga Return DirectCast(Items, List(Of Persona)).Find(AddressOf comparatore.CompareKeys)
mi fa chiamare la funzione comparatore.CompareKeys (o CompareId) senza darmi errore visto che manca l'obj che dovrei passargli tra parentesi, cioè l'item della classe collection, ovvero la persona?
Come viene passato questo parametro?

Ciao, grazie 1000!
Daniel

rossimarko Profilo | Guru

Tu non chiami direttamente il metodo ma passi il riferimento al metodo.
Questo metodo dovrà implementare un "template" predefinito che è stabilito dal delegate. Se guardi come parametro la funzione Find vuole il riferimento ad un metodo (delegate). Questo delegate definisce è stato definito come funzione che ritorna un boolean e ha come parametro un oggetto dello stesso tipo di quello contenuto nella lista.

Poi si occuperà il metodo Find al suo interno di richiamare il metodo per ogni oggetto della lista passando come parametro l'oggetto stesso.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
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