2012-08-05 55 views
5

基本上我想适应此代码为LINQ:只选择LINQ中的第一个对象?

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

    return null; 
} 

代码检查每个瓦片,并且返回与所述物体碰撞的第一瓦片。我只想第一瓷砖,地砖不是一个数组一样,如果我用这个,我会得到:

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

} 

我该怎么办?

回答

16

您可以使用.First().FirstOrDefault()扩展方法,使您可以检索的第一个元素相匹配的特定条件:

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

.First()扩展方法将抛出一个异常,如果没有元素在数组中发现,符合所需条件。另一方面,.FirstOrDefault()将静默地返回null。因此,请使用更适合您需求的产品。

请注意,还有您可以使用的.Single()扩展方法。与.First()的区别在于,如果多个元素匹配条件,则.Single()将引发异常,而.First()将返回第一个元素。

+0

+1,只要SO让我接受。 :) – ApprenticeHacker 2012-08-05 16:14:25