Today at work, it was necessary to code a solution that included a List.Find() that I've coded many times and has become almost second nature . . . in C#. However, the app, being written in VB, required a solution in VB. After some searching on the web, I was left without a satisfactory solution. After several (read: many) rounds of trial and error, I finally stumbled upon the correct syntax. Later this afternoon it occurred to me that this would make an excellent inaugural blog post.
In C#, the code is very simple (examples can be found on MSDN). Assuming we have an object named Person that has a property named FirstName of type string:
string strPersonToFind = "Justin";
Person myPerson = People.Find(
delegate (Person p)
{
return p.FirstName == strPersonToFind;
});
In VB, the examples were far less clean:
Dim strPersonToFind As string = "Justin"
Sub doSomething(ByVal People As List(Of Person))
Person myPerson = People.Find(addressof FindPerson)
End Sub
Function FindPerson(ByVal s As string) As Boolean
If s = strPersonToFind Then
Return True
Else
Return False
End If
End Function
Seriously? The VB example has several obvious shortcomings. First, it requires a page-scoped variable for comparison or a hard-coded comparator. Second, it took 11 lines of code to accomplish what was done in C# in 3. Third, it's just plain ugly; it requires jumping between Subs & Functions and is pretty hard to follow and maintain.
The solution is very simple, looks similar to the C# example, and can be used from within a single Sub or Function (eliminating the need for page-scoped variables):
Dim strPersonToFind As string = "Justin"
Person myPerson = People.Find(Function(ByVal p As Person) p.FirstName = strPersonToFind)
Only two lines of code and very clear and concise syntax.
Important Notes: This is in reference to System.Collections.Generic.List<T> (C#) and System.Collections.Generic.List(Of T) (VB). Also, I believe this known as Lambda Expression syntax and as such, only works .NET 3.5 and higher.
If this helped you, let me know in the comments!