Inizia scrivendo una versione migliore di doppio. TryParse:
static double? TryParseDouble(this string s)
{
double d;
return double.TryParse(s, out d) ? (double?)d : (double?)null;
}
OK, ora avete qualcosa che si può facilmente utilizzare per eliminare il ciclo interno del tutto, quindi il problema va via:
foreach(var item in items)
if (!otheritems.Any(otherItem=>otherItem.TryParseDouble() == null))
DoStuff();
Piuttosto che cercare di capire come spostare il controllo, basta scrivere il codice che assomiglia alla logica. Se la logica è "non fare cose se qualcun altro degli elementi non viene analizzato come doppio", quindi utilizzare il predicato Qualsiasi per testare tutti gli altri elementi per vedere se alcuni di essi non vengono analizzati come doppi. Niente loop, quindi non è necessario alcun controllo del loop di fantasia.
Sarei propenso a fare un ulteriore passo avanti; catturare la logica in una query, e quindi scorrere la query:
var goodItems = from item in items
where !item.OtherItems.Any(otherItem=>otherItem.TryParseDouble() == null))
select item;
foreach(var goodItem in goodItems)
DoStuff(goodItem);
fonte
2011-11-17 14:34:51
Faccio notare che questo non è la firma di Double.TryParse. –