Domanda

È possibile? Dato che C # usa stringhe immutabili, ci si potrebbe aspettare che ci sarebbe un metodo sulla falsariga di:

var expensive = ReadHugeStringFromAFile();
var cheap = expensive.SharedSubstring(1);

Se non esiste tale funzione, perché preoccuparsi di rendere immutabili le stringhe? Oppure, in alternativa, se le stringhe sono già immutabili per altri motivi, perché non fornire questo metodo?

Il motivo specifico per cui sto esaminando questo sta facendo un po 'di analisi dei file. I parser di discesa ricorsivi semplici (come quello generato da TinyPG, o quelli facilmente scritti a mano) usano Substring ovunque. Ciò significa che se si dà loro un file di grandi dimensioni per l'analisi, la variazione della memoria è incredibile. Sicuramente ci sono soluzioni alternative: fondamentalmente esegui il rollup della tua classe SubString e ovviamente dimentica di essere in grado di utilizzare i metodi String come StartsWith o le librerie String come Regex, quindi è necessario distribuire anche la tua versione di questi. Presumo che generatori di parser come ANTLR lo facciano fondamentalmente, ma il mio formato è abbastanza semplice da non giustificare l'uso di un simile strumento mostruoso. Anche TinyPG è probabilmente un eccesso.

Qualcuno, per favore, mi dica che mi manca un metodo C # standard ovvio o non così ovvio da qualche parte ...

È stato utile?

Soluzione

No, non c'è niente del genere.

Le stringhe .NET contengono direttamente i loro dati di testo, a differenza delle stringhe Java che hanno un riferimento a un array di caratteri, un offset e una lunghezza.

Entrambe le soluzioni hanno " vittorie " in alcune situazioni e perdite in altre.

Se sei assolutamente sicuro questo sarà un killer per te, potresti implementare una stringa in stile Java da usare nelle tue API interne.

Altri suggerimenti

Per quanto ne so, tutti i parser più grandi usano i flussi per analizzare. Non è adatto alla tua situazione?

Il framework .NET supporta interning di stringhe . Questa è una soluzione parziale ma non offre la possibilità di riutilizzare parti di una stringa. Penso che il riutilizzo della sottostringa provocherà alcuni problemi non così precisi a prima vista. Se devi fare molta manipolazione delle stringhe usando StringBuilder è la strada da percorrere.

Nothing in C # ti offre la funzionalità pronta all'uso che stai cercando.

Ciò che desidera è una Struttura dei dati della corda , una struttura dei dati immutabile che supporta O (1) concatena e sottostringhe O (log n). Non riesco a trovare nessuna implementazione C # di una corda, ma qui una Java .

A parte questo, non c'è niente di sbagliato nell'usare TinyPG o ANTLR se questo è il modo più semplice per fare le cose.

Bene, puoi usare " unsafe " per gestire autonomamente la memoria, il che potrebbe consentirti di fare ciò che stai cercando. Anche la classe StringBuilder è ottima per le situazioni in cui una stringa deve essere manipolata più volte, poiché non crea una nuova stringa con ogni manipolazione.

Puoi facilmente scrivere una banale classe per rappresentare "economico". Conterrebbe semplicemente l'indice dell'inizio della sottostringa e la lunghezza della sottostringa. Un paio di metodi ti permetterebbero di leggere la sottostringa quando necessario - un operatore di cast di stringhe sarebbe l'ideale come potresti usare

string text = myCheapObject;

e funzionerebbe perfettamente come se fosse una stringa reale. Aggiungere il supporto per alcuni metodi utili come StartsWith sarebbe semplice e veloce (sarebbero tutti una fodera).

L'altra opzione è scrivere un parser regolare e archiviare i token in un dizionario dal quale si condividono i riferimenti ai token anziché conservare più copie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top