2012-08-05 17 views
5

Fondamentalmente voglio adattare questo codice per LINQ:Seleziona solo il primo oggetto in LINQ?

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

    return null; 
} 

Il codice controlla ogni piastrella e restituisce la prima piastrella che si scontra con l'oggetto. Voglio solo la piastrella prima, non una serie di piastrelle come vorrei avere se uso questo:

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

} 

Cosa devo fare?

risposta

16

Si potrebbe utilizzare il metodo .First() o .FirstOrDefault() estensione che consente di recuperare il primo elemento corrispondente una certa condizione:

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

Il metodo di estensione .First() sarà un'eccezione se nessun elemento si trova nella matrice che corrisponde alla condizione richiesta. Il .FirstOrDefault() d'altra parte restituirà silenziosamente null. Quindi usa quello più adatto alle tue esigenze.

Si noti che esiste anche il metodo di estensione .Single() che è possibile utilizzare. La differenza con .First() è che .Single() genererà un'eccezione se più di un elemento corrisponde alla condizione mentre .First() restituirà il primo.

+0

+1, accetterà questo non appena SO mi consente. :) – ApprenticeHacker

Problemi correlati