2010-09-13 21 views
6

Veo un patrón en mi código donde la expresión lambda se muestra como no cubierta en la cobertura del código, el depurador SÍ paso por el código y no hay bloques condicionales.Cobertura de código en Lambda Expressions

public CollectionModel() 
{ 
    List<Language> languages = LanguageService.GetLanguages(); 
    this.LanguageListItems = 
     languages.Select(
      s => 
      new SelectListItem { Text = s.Name, Value = s.LanguageCode, Selected = false }). // <-- this shows as not covered 
      AsEnumerable(); 
} 

Es algo extraño. ¿Algunas ideas?

Respuesta

5

Lo que creo que quiere decir es que el depurador no está pasando por encima de la línea indicada; ¿está bien?

Si esa es su pregunta, la respuesta es que, al menos en este caso particular, lo que está viendo es ejecución diferida. Todos los métodos de extensión LINQ provistos por System.Linq.Enumerable exhiben este comportamiento: a saber, el código dentro de la propia instrucción lambda es no ejecutado en la línea donde lo está definiendo. El código solo se ejecuta una vez que se enumera el objeto resultante.

Añadir esta debajo del código que ha publicado:

foreach (var x in this.LanguageListItems) 
{ 
    var local = x; 
} 

Aquí, verá el salto depurador de nuevo a su lambda.

+0

+1. Alternativamente, puede usar 'ToList' en lugar de' AsEnumerable' y tiene el mismo efecto. – Niki

+1

@nikie: Sí, pero quería que él viera específicamente al depurador volver al lambda tras la iteración, ya que creo que lo hace inequívocamente claro sobre lo que está sucediendo. –

+2

Tenga en cuenta también que si la colección está vacía, nunca se llamará a la proyección, incluso si la colección se itera. –