2012-08-05 27 views
5

Về cơ bản tôi muốn thích nghi với mã này cho LINQ:Chỉ chọn đối tượng đầu tiên trong LINQ?

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

    return null; 
} 

Mã kiểm tra mỗi ngói và trả về gạch đầu tiên mà va chạm với đối tượng. Tôi chỉ muốn ngói đầu tiên, không phải là một mảng của gạch như tôi sẽ nhận được nếu tôi sử dụng này:

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

} 

Tôi nên làm gì?

Trả lời

16

Bạn có thể sử dụng phương pháp .First() hoặc .FirstOrDefault() phần mở rộng cho phép bạn lấy phần tử đầu tiên phù hợp với một điều kiện nhất định:

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

Các phương pháp khuyến nông .First() sẽ ném một ngoại lệ nếu không có yếu tố được tìm thấy trong mảng đó phù hợp với điều kiện yêu cầu. Mặt khác, .FirstOrDefault() sẽ âm thầm trả về giá trị rỗng. Vì vậy, sử dụng một trong đó tốt hơn phù hợp với nhu cầu của bạn.

Lưu ý rằng cũng có phương thức mở rộng .Single() mà bạn có thể sử dụng. Sự khác biệt với .First().Single() sẽ ném một ngoại lệ nếu có nhiều hơn một yếu tố khớp với điều kiện trong khi .First() sẽ trả lại giá trị đầu tiên.

+0

+1, sẽ chấp nhận điều này ngay khi SO cho phép tôi. :) – ApprenticeHacker

Các vấn đề liên quan