2010-06-03 9 views
16

Tôi muốn viết:Tạo IEnumerable <T> .find()

IEnumerable<Car> cars; 
cars.Find(car => car.Color == "Blue") 

Tôi có thể thực hiện điều này với các phương pháp mở rộng? Sau đây không thành công vì nó đệ quy gọi chính nó thay vì gọi IList.Find().

public static T Find<T>(this IEnumerable<T> list, Predicate<PermitSummary> match) 
{ 
    return list.ToList().Find(match); 
} 

Cảm ơn!

Trả lời

46

Phương pháp này đã tồn tại. Nó được gọi là FirstOrDefault

cars.FirstOrDefault(car => car.Color == "Blue"); 

Nếu bạn đã thực hiện nó cho mình nó sẽ trông một chút như thế này

public static T Find<T>(this IEnumerable<T> enumerable, Func<T,bool> predicate) { 
    foreach (var current in enumerable) { 
    if (predicate(current)) { 
     return current; 
    } 
    } 
    return default(T); 
} 
+0

Cảm ơn. Không nhận ra tình trạng quá tải này tồn tại. –

+0

Câu trả lời hay! Tôi không bao giờ nhận ra quá tải này tồn tại và đã được thêm thừa .Where (...). Đầu tiên() báo cáo. – jhappoldt

3

Bạn biết rằng Find(...) có thể được thay thế bằng Where/First

IEnumerable<Car> cars; 
var result = cars.Where(c => c.Color == "Blue").FirstOrDefault(); 

điều này sẽ return null trong trường hợp vị từ không khớp.

+3

Không cần đâu. FirstOrDefault cũng sẽ dùng Predicate. – Stephan

+3

Bạn có thể chỉ định vị từ trực tiếp trên 'FirstOrDefault()' và để 'Where()' ra ngoài. –

+0

Ah, bạn đúng, quên về vị từ. – Aren

8

Jared là chính xác nếu bạn đang tìm kiếm một chiếc xe màu xanh, bất kỳ chiếc xe màu xanh nào cũng sẽ đủ. Đó là những gì bạn đang tìm kiếm, hoặc bạn đang tìm kiếm một danh sách những chiếc xe màu xanh?

Đầu tiên xanh xe:

Car oneCar = cars.FirstOrDefault(c => c.Color.Equals("Blue")); 

Danh sách xe màu xanh:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue")); 
+0

Cảm ơn, và nếu bạn đang tìm kiếm chính xác một chiếc xe màu xanh: xe ô tô.Single (car => car.Color.Equals ("Blue") –

+0

Duy nhất là okay nếu bạn được đảm bảo có ONLY ONE xe trong toàn bộ danh sách. Nếu bạn có nhiều hơn một chiếc xe, hoặc không có xe hơi ở tất cả, bạn sẽ ném một InvalidOperationException. FirstOrDefault sẽ trả lại chiếc xe màu xanh của bạn, hoặc loại mặc định (thường null). vị ngữ. – StyxRiver