2008-09-25 13 views

Respuesta

-4

Si bien esto no es un tutorial, aquí hay un código que ilustra el concepto:

public List<string> ValidUsers(List<User> users) { 
    List<string> names = new List<string>(); 
    foreach(User user in users) { 
    if(user.Valid) { 
     names.Add(user.Name); 
    } 
    } 
    return names; 
} 
+11

Esto no es una lista de comprensión. – erikkallen

6

P @Ian

return (from user in users 
     where user.Valid 
     select user.Name).ToArray(); 
+1

No especificó LINQ, así que fui lo más básico posible. Tu ejemplo es definitivamente preferido. –

20

encontrado esto cuando yo estaba mirando cómo hacer listas por comprensión en C# ...

Cuando alguien dice listas de comprensión, inmediatamente pienso en Python. El siguiente código genera una lista que tiene este aspecto:

[0,2,4,6,8,10,12,14,16,18] 

manera el Python es así:

list = [2*number for number in range(0,10)] 

En C#:

var list2 = from number in Enumerable.Range(0, 10) select 2*number; 

Ambos métodos son evaluados con pereza.

47

Una lista La comprensión es un tipo de notación de conjunto en la que el programador puede describir las propiedades que los miembros de un conjunto deben cumplir. Por lo general, se usa para crear un conjunto basado en otros conjuntos o conjuntos ya existentes al aplicar algún tipo de combinación, función de transformación o reducción a los conjuntos existentes.

Considere el siguiente problema: Tiene una secuencia de 10 números del 0 al 9 y necesita extraer todos los números pares de esa secuencia. En un lenguaje C# versión de tales 1.1, que eran prácticamente confinada al código siguiente para resolver este problema:

ArrayList evens = new ArrayList(); 
ArrayList numbers = Range(10); 
int size = numbers.Count; 
int i = 0; 

while (i < size) 
{ 
    if (i % 2 == 0) 
    { 
     evens.Add(i); 
    } 
    i++; 
} 

El código anterior no muestra la implementación de la función Rango, que está disponible en el código completo listado a continuación. Con la llegada de C# 3.0 y .NET Framework 3.5, una notación de Comprensión de listas basada en Linq ahora está disponible para los programadores de C#. El código C# 1.1 anterior puede ser portado a C# 3.0, así:

IEnumerable<int> numbers = Enumerable.Range(0, 10); 
var evens = from num in numbers where num % 2 == 0 select num; 

Y técnicamente hablando, el código C# 3.0 arriba puede ser escrito como una sola línea moviendo la llamada a Enumarable.Range a la Expresión de Linq que genera la secuencia evens. En la Comprensión de lista C#, estoy reduciendo los números establecidos al aplicar una función (el módulo 2) a esa secuencia. Esto produce la secuencia evens de una manera mucho más concisa y evita el uso de la sintaxis de bucle. Ahora, usted puede preguntarse: ¿esto es puramente sintaxis? No lo sé, pero definitivamente investigaré, e incluso haré la pregunta yo mismo aquí. Sospecho que esto no es solo azúcar de sintaxis y que hay algunas optimizaciones verdaderas que se pueden hacer al utilizar las mónadas subyacentes.

El listado de código completo está disponible here.

Cuestiones relacionadas