Partendo da un interessante articolo sugli anonymous methods sono arrivato ad un esempio applicato a "List<T>" e ai metodi che "List<T>" espone.
public
class Person
{
public int Age;
public string Name;
public Person(int Age, string name)
{
this.Name = name;
this.Age = Age;
}
}
List<Person> persons = new List<Person>();
persons.Add(new Person(12,"Marco"));
persons.Add(new Person(29, "Paolo"));
persons.Add(new Person(31, "Ugo"));
bool exist = persons.Exists(delegate(Person p) { return p.Name == "Paolo"; }); //true
int totalAge = 0;
persons.ForEach(delegate(Person p){totalAge += p.Age;}); //TotalAge=72
Fondamentalmente una lista generica mette a disposizione dei metodi i quali invocano dei "delegates generici" denominati Predicate o Action a seconda del metodo invocato, ad esempio ForEach invoca l'Action associata per ogni item presente nella lista.
I metodi sono parecchi, tra questi spicca FindAll che ritorna un subset degli items contenuti nella lista filtrati secondo un determinato criterio.
Esempio:
List<string> OnlyBColors=l.FindAll(delegate(string s){return s.StartsWith("P");}); // Ritorna una list che contiene solo Paolo
...E VB 2005 (che non ha gli anonymous methods?)
Sub Main()
Dim persons As New List(Of Person)
persons.Add(New Person(12, "Marco"))
persons.Add(New Person(29, "Paolo"))
persons.Add(New Person(31, "Ugo"))
Dim exist As Boolean = persons.Exists(New Predicate(Of Person)(AddressOf NameExist)) '//True
persons.ForEach(New Action(Of Person)(AddressOf AddAge))
Console.WriteLine(totalAge) '// 72
End Sub
Public Function NameExist(ByVal p As Person) As Boolean
Return p.Name = "Paolo"
End Function
Private totalAge As Integer
Public Sub AddAge(ByVal p As Person)
totalAge += p.Age
End Sub
Come vedete, entrambi i linguaggi permettono di sfruttare queste features facendo si che il nostro codice sarà sempre più "generics based".
Se vi va di catturare la vera natura degli anonymous methods, ovvero il concetto di closure e le sue implicazioni, date un occhiata al blog di Antonio Cisternino