2009-06-23 23 views
7

Encontré algo bastante extraño (¡creo!). Si trato de poner un punto de interrupción en el método yes(), nunca pausará el programa cuando ejecute la función. Si trato de hacer lo mismo con cualquier otra línea de código, funcionará tal como se esperaba. ¿Es un error, o hay algo que me está escapando?El depurador no llega al punto de interrupción

El filtro devolverá los 2 objetos, todo parece funcionar como se espera excepto el depurador.

private void Form1_Load(object sender, EventArgs e) { 
    List<LOL> list = new List<LOL>(); 
    list.Add(new LOL()); 
    list.Add(new LOL()); 

    IEnumerable<LOL> filter = list.Where(
     delegate(LOL lol) { 
      return lol.yes(); 
     } 
    ); 

    string l = ""; <------this is hit by the debugger 
} 

class LOL { 
    public bool yes() { 
     bool ret = true; <---------this is NOT hit by the debugger 
     return ret; 
    } 
} 
+3

Recuerde, el resultado de un método de consulta como Where es _un objeto que representa la consulta_. No son los _resultados_ de la consulta. Es la consulta _sí mismo_. No es hasta que dices "oye pregunta, ¿cuáles son tus resultados?" que la consulta realmente se ejecuta. –

+1

Ahora puede responder este pequeño acertijo: Problema: http://blogs.msdn.com/ericlippert/archive/2007/09/05/psychic-debugging-part-one.aspx Solución: http: //blogs.msdn. com/ericlippert/archive/2007/09/06/psychic-debugging-part-two.aspx –

Respuesta

16

Enumerable.Where es un operador perezoso - hasta que llame algo que pasa por el IEnumerable devuelto por donde (. Es decir, llamando .ToList() sobre ella), su función no será llamado.

Intente cambiar su código para esto y ver si se llama a:

.... 
IEnumerable<LOL> filter = list.Where(
    delegate(LOL lol) { 
     return lol.yes(); 
    } 
).ToList(); 

string l = ""; 
2

Usted tiene que materializar la lista. Agregue un ...

filter.ToList(); 

... después de la declaración y llegará a su punto de interrupción. Sobre la mejor discusión que he visto sobre eso es here. Hace la evaluación perezosa una justicia mucho mejor que la que podía hacer.

2

Como han dicho otros, acaba de definir sus criterios pero no los ha solicitado. Esto se llama carga lenta (chicos, corríjanme si estoy equivocado).

Ejecute un bucle foreach en el filtro para ver qué pasa.

2

Jonathan es el correcto.

Intente ejecutar esta aplicación de consola y establezca puntos de interrupción donde se indique para verla con claridad.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<LOL> list = new List<LOL>(); 
      list.Add(new LOL()); 
      list.Add(new LOL()); 

      IEnumerable<LOL> filter = list.Where(
       delegate(LOL lol) 
       { 
        return lol.yes(); 
       } 
      ); 

      // Breakpoint #2 will not have been yet. 
      Console.Write("No Breakpoint"); // Breakpoint #1 
      // (Breakpoint #2 will now be hit.) 
      Console.Write("Breakpoint! " + filter.Count()); 
     } 

     class LOL 
     { 
      public bool yes() 
      { 
       bool ret = true; // Breakpoint #2 
       return ret; 
      } 

     } 

    } 
} 
Cuestiones relacionadas