Bắt đầu bằng cách viết một phiên bản tốt hơn của Double. TryParse:
static double? TryParseDouble(this string s)
{
double d;
return double.TryParse(s, out d) ? (double?)d : (double?)null;
}
OK, bây giờ bạn có một cái gì đó bạn có thể dễ dàng sử dụng để loại bỏ các vòng lặp bên trong hoàn toàn, vì vậy vấn đề đi xa:
foreach(var item in items)
if (!otheritems.Any(otherItem=>otherItem.TryParseDouble() == null))
DoStuff();
Thay vì cố gắng tìm ra cách di chuyển kiểm soát xung quanh, chỉ cần viết mã trông giống như logic. Nếu logic là "không làm công cụ nếu bất kỳ các mục khác không phân tích cú pháp như tăng gấp đôi", sau đó sử dụng bất kỳ vị ngữ để kiểm tra tất cả các mặt hàng khác để xem nếu bất kỳ trong số họ không phân tích cú đúp. Không có vòng lặp, do đó không cần điều khiển vòng lặp lạ mắt.
Tôi sẽ có khuynh hướng tiến thêm một bước; nắm bắt logic trong truy vấn và sau đó lặp lại truy vấn:
var goodItems = from item in items
where !item.OtherItems.Any(otherItem=>otherItem.TryParseDouble() == null))
select item;
foreach(var goodItem in goodItems)
DoStuff(goodItem);
Nguồn
2011-11-17 14:34:51
Tôi lưu ý rằng đó không phải là chữ ký của double.TryParse. –