Comienza escribiendo una mejor versión de doble. TryParse:
static double? TryParseDouble(this string s)
{
double d;
return double.TryParse(s, out d) ? (double?)d : (double?)null;
}
bien, ahora usted tiene algo que pueda usar para eliminar el bucle interior por completo, por lo que el problema desaparece:
foreach(var item in items)
if (!otheritems.Any(otherItem=>otherItem.TryParseDouble() == null))
DoStuff();
En lugar de tratar de encontrar la manera de moverse control alrededor, acaba de escribir código que se parece a la lógica. Si la lógica es "no hacer cosas si alguno de los otros elementos no se analiza como dobles", entonces use el predicado Cualquier para probar todos los demás elementos para ver si alguno de ellos no se analiza como dobles. No hay bucles, por lo que no es necesario un control de bucle sofisticado.
Me inclinaría a ir un paso más allá; capture la lógica en una consulta, y luego itere la consulta:
var goodItems = from item in items
where !item.OtherItems.Any(otherItem=>otherItem.TryParseDouble() == null))
select item;
foreach(var goodItem in goodItems)
DoStuff(goodItem);
Noto que esa no es la firma de double.TryParse. –