FUNC (El delegado genérico)

FUNC se define como un delegado que devuelve un valor y genérico.

C#
public delegate TResult Func<T,TResult>(T arg)
public delegate TResult Func<T1,T2,TResult>(T1 arg1,T2 arg2)
public delegate TResult Func<T1,T2,T3,TResult>(T1 arg1,T2 arg2,T3 arg3)
public delegate TResult Func<T1,T2,T3,T4,TResult>(T1 arg1,T2 arg2,T3 arg3,T4 arg4)
public delegate TResult Func<TResult>()

Vb.Net
Public Delegate Function Func(Of T,TResult)(arg as T) As TResult
Public Delegate Function Func(Of T1,T2,TResult)(arg1 as T1,arg2 as T2) As TResult
Public Delegate Function Func(Of T1,T2,T3,TResult)(arg1 as T1,arg2 as T2,arg3 as T3) As TResult Public Delegate Function Func(Of T1,T2,T3,T4,TResult)              (arg1 as T1,arg2 as T2,arg3 as T3,arg4 as T4)              As TResult Public Delegate Function Func(Of TResult)              ()              As TResult

Tal y como puedes ver en las definiciones siempre se sigue la misma regla: El ultimo tipo declarado en el genérico es el tipo devuelto por la función que implemente este delegado. Muchas de los métodos LINQ que extienden toman como parámetro un FUNC. Como por ejemplo:

C#
Where<TSource>(Func<TSource,bool> predicate)
Where<TSource>(Func<TSource,int,bool> predicate)
Select<TSource,TResult>(Func<TSource,int,TResult> selector)
Select<TSource,TResult>(Func<TSource,TResult> selector)

Vb.Net
Where(predicate as Func(Of TSource, Boolean))
Where(predicate as Func(Of TSource, Integer, Boolean))
Select(Of TResult)(selector as Func(Of TSource,Integer,TResult))
Select(Of TResult)(selector as Func(Of TSource,TResult))

Para poder utilizar este tipo de métodos con esos parámetros debes crear primero la función que implementa el FUNC, para ello debes crear una función con la misma signatura que el definido por el FUNC.

C# 
Func<string,bool> filtro=delegate (string s)
{
   return s.Length==5;
}
IEnumerable<string> cincoCaracs=nombres.Where<String>(filtro);

Vb.Net 
Function FiltroCaracs(i As String) As Boolean        
  Return i.Length=5
End Function
Dim filtro as Func(Of String,Boolean) filtro = AddressOf FiltroCaracs
Dim cincoCaracs as IEnumerable(Of String) cincoCaracs=nombres.Where(filtro)

En el siguiente post vas a ver como puedes indicar un tipo FUNC más fácilmente.

Anuncis

2 pensaments sobre “FUNC (El delegado genérico)

  1. Retroenllaç: LINQ como extensión de método | My freelancer life
  2. Retroenllaç: Lambda | My freelancer life

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s