C'è un'altra potenziale risposta qui, e penso che akalenuk lo abbia accennato. Usa una forse monade o qualche altro tipo di opzione simile.
Ad esempio C # /. NET ha Nullable<T>
, che non è la stessa ma è carina close , ma limitato a Nullable<int>
dovrebbe essere sufficiente.
public static Nullable<int> toInt(string s)
{
int i = 0;
if (int.TryParse(s, out I))
return new Nullable<int>(i);
return new Nullable<int>();
}
Ricorda inoltre che la trasformazione inInt è non da 1 a 1 e invertibile. Stai trasformando da un set grande, l'insieme di tutte le stringhe possibili, all'insieme di tutti i possibili numeri interi (limitato dai tuoi tipi ... che è rilevante, ma non così tanto). Quindi non è necessario, o addirittura ragionevole supporre che toString sia l'inverso di toInt. Il caso in cui toInt (s) .HasValue == false copre il caso (set di tutte le stringhe) - (set di tutte le stringhe di numeri)
Tuttavia, non abbiamo finito.
Questo è in realtà il caso generale? In questo caso, che dire delle stringhe di numeri per le quali il valore è troppo grande per rientrare in un numero intero? Chiaramente, è ancora un numero. Se non è il caso generale, il tuo caso d'uso vincola l'insieme di valori di output nell'intervallo di un numero intero? Se è così, allora hai finito.
... se no, allora dobbiamo considerare se abbiamo bisogno di un altro tipo (Double? BigInteger?) BigInteger sembra che possa adattarsi al caso generale, ancora limitato dalla memoria (OutOfMemoryException è possibile ).
Alla fine, se stiamo cercando di ottenere qualcosa di più generale possibile, andrei con:
public static Nullable<BigInteger> toInt(string s)
{
BigInteger bi = new BigInteger();
if (BigInteger.TryParse(s, out bi))
return new Nullable<BigInteger>(bi);
return new Nullable<BigInteger>();
}
Ora, per il grande sesso ... facciamolo in modo funzionale (opzioni F # +):
let toInt s =
match BigInteger.TryParse s with
| (true, parsed) -> Some parsed
| (false, _) -> None