net framework c# linq predicate

framework - predicatebuilder c#



string.Contains como un predicado no es una llamada de funciĆ³n? (4)

Encontré esta muestra de código en SO (no recuerdo de dónde: /) que me permitió verificar los argumentos de código de línea al iniciar mi aplicación:

if (e.Args.Length == 0 || e.Args.Any("-show".Contains)) { //show interface... }

Parece que no puedo entender cómo funciona el "-show".Contains . Y si hay alguna diferencia con un (clásico) x => x.Contains(''"-show") (excepto por la evidente ganancia de escritura).

Funciona como un hechizo pero me gustaría entender por qué, siento que algo grande está sucediendo.


Como ya dijo @jmcilhiney, es una abreviación de:

.Any(s => "-show".Contains(s))

Contains es una función que acepta 1 parámetro que es de tipo cadena (y devuelve un valor booleano). Any() en este caso quiere una función que necesita 1 param, que es una cadena y que devuelve un valor booleano. Así que en lugar de agregar un lambda warapper s=> adicional, puede devolver directamente .Contains

En términos técnicos esto es un:

Func<string, boolean> //1 param string, output: boolean

Tenga en cuenta que este código coincide con cualquier argumento que sea parte de -show

por lo tanto, cualquiera de los siguientes argumentos coinciden!

-show -s sh ow h w // etc..


El equivalente sería x => "-show".Contains(x) lugar de lo que has mostrado.

Después de eso, te darás cuenta de que todo lo que estás haciendo al introducir el lambda basado en x es crear una función que acepte un solo argumento de string y que devuelva un bool y que envuelva una función que acepte una sola string y devuelva un bool . No hay necesidad de la envoltura.


Esta:

.Any("-show".Contains)

es básicamente una taquigrafía para esto:

.Any(s => "-show".Contains(s))

El método Any toma un delegado como parámetro y puede crear ese delegado de varias maneras. El primer fragmento de código utiliza un grupo de métodos, mientras que el segundo utiliza un Lambda.

No es realmente exacto decir que la primera es una abreviatura de la segunda porque los grupos de métodos son anteriores a Lambdas, pero si piensa en términos de Lambdas cuando llama a métodos LINQ como Any entonces efectivamente es el caso.


Any() espera un delegado Func<TSource, bool> . Por lo tanto, cualquier función que devuelva un bool y tome un argumento que sea del mismo tipo que los elementos de la colección ( string en su caso) se puede aplicar. Esta puede ser una función existente, o una expresión lambda.

La firma de String.Contains es

bool Contains(string s)

Es por eso que puedes pasarlo a Any()