Начните с написания лучшей версии Double.TryParse:
static double? TryParseDouble(this string s)
{
double d;
return double.TryParse(s, out d) ? (double?)d : (double?)null;
}
Хорошо, теперь у вас есть кое-что, что вы можете легко использовать для полного устранения внутреннего цикла, поэтому проблема исчезнет:
foreach(var item in items)
if (!otheritems.Any(otherItem=>otherItem.TryParseDouble() == null))
DoStuff();
Вместо того, чтобы пытаться понять, как перемещать управление, просто напишите код, который выглядит как логика . Если логика гласит: «Не делай вещи, если какой-либо из других элементов не анализируется как double», тогда используйте предикат Any, чтобы проверить все остальные элементы, чтобы увидеть, не разбирается ли какой-либо из них как double. Никаких петель, поэтому не нужно никакого необычного управления петлями.
Я был бы склонен пойти еще дальше; захватить логику в запросе, а затем повторить запрос:
var goodItems = from item in items
where !item.OtherItems.Any(otherItem=>otherItem.TryParseDouble() == null))
select item;
foreach(var goodItem in goodItems)
DoStuff(goodItem);