2012-08-05 19 views
5

Básicamente quiero adaptar este código para LINQ:¿Seleccionar solo el primer objeto en LINQ?

private Tile CheckCollision(Tile[] tiles) 
{ 
    foreach (var tile in tiles) 
    { 
     if (tile.Rectangle.IntersectsWith(Rectangle)) 
     { 
      return tile; 
     } 
    } 

    return null; 
} 

El código comprueba cada baldosa y devuelve la primera baldosa que choca con el objeto. Sólo quiero la baldosa primera, no una serie de azulejos como me gustaría conseguir si uso esto:

private Tile CheckCollision(Tile[] tiles) 
{ 
    var rtn = 
     from tile in tiles 
     where tile.Rectangle.IntersectsWith(Rectangle) 
     select tile; 

} 

¿Qué debo hacer?

Respuesta

16

Se puede usar el método .First() o .FirstOrDefault() extensión que le permite recuperar el primer elemento que cumpla una determinada condición:

private Tile CheckCollision(Tile[] tiles) 
{ 
    return tiles.FirstOrDefault(t => t.Rectangle.IntersectsWith(Rectangle)); 
} 

El método de extensión .First() será una excepción si no hay ningún elemento se encuentra en la matriz que se coincide con la condición requerida. El .FirstOrDefault() por el contrario devolverá nulo en silencio. Entonces use el que mejor se adapte a sus necesidades.

Observe que también existe el método de extensión .Single() que puede usar. La diferencia con .First() es que .Single() emitirá una excepción si más de un elemento coincide con la condición, mientras que .First() devolverá el primero.

+0

+1, aceptaré esto tan pronto como SO me lo permita. :) – ApprenticeHacker

Cuestiones relacionadas