2013-01-13 11 views
5

Ci sono motivi validi per cui non esiste un sovraccarico di String.Split che accetta una stringa delimitatore e un testo da dividere?Perché non c'è un sovraccarico di stringa.Split (stringa)?

string[] Split(string delimiter) 

che potrebbe poi essere usato come

string input = "This - is - an - example"; 
string[] splitted = input.Split(" - "); 
// results in: 
// { "This", "is", "an", "example" } 

so davvero, che posso creare un metodo di estensione facilmente, ma ci deve essere valida ragione per cui questo non è stato aggiunto.

Si noti che non sto cercando una soluzione su come suddividere una stringa utilizzando un delimitatore di stringhe, sono piuttosto alla ricerca di una spiegazione, perché un tale sovraccarico potrebbe causare problemi. Questo perché non penso che causerebbe davvero problemi e trovo davvero difficile per i principianti capire perché dobbiamo passare un effettivo string[] invece di un semplice string come delimitatore.

+3

immagino c'è un numero qualsiasi di metodi apparentemente semplici che potrebbero essere aggiunti, ma è per questo che è possibile aggiungere i propri tramite i metodi di estensione, come si fa notare. – glosrob

+0

Come puoi vedere dalle risposte, è improbabile che tu possa rispondere a questa domanda. La mia * ipotesi * è che ha qualcosa a che fare con uno studio di usabilità in cui i soggetti del test si sono messi nei guai in qualche modo, probabilmente a causa del non aver affrontato il sovraccarico Char vs String correttamente. Solo i progettisti di framework .NET possono rispondere con precisione, non pubblicano qui. –

+1

@HansPassant Ho contattato [Eric Lippert] (http://stackoverflow.com/users/88656/eric-lippert) riguardo a questo, speriamo che possa fornire ulteriori approfondimenti. – GameScripting

risposta

3

Ottimizzare la questione di essere "Perché è il parametro StringSplitOptions obbligatoria quando si chiama String.Split() con un argomento String []? " potrebbe fornire una risposta alla tua domanda.

Si noti che in realtà non esiste un overload String.Split() che accetta un singolo carattere. Il sovraccarico prende un Char [] ma poichè è un array params puoi chiamarlo con un singolo carattere e viene implicitamente lanciato su un Char []. per esempio.

"1,2,3,4,5".Split(','); 

chiama lo stesso Split() di sovraccarico come

"1,2,3,4,5".Split(new[] { ',' }); 

Se ci fosse un sovraccarico di Split(), che ha accettato un unico argomento di String [] allora si sarebbe in grado di chiamare Spalato passando un argomento a stringa singola.

Tuttavia, il sovraccarico non esiste e StringSplitOptions è obbligatorio quando si passa una stringa [] a Split. Per quanto riguarda il motivo per cui StringSplitOptions è obbligatorio, posso solo teorizzare, ma può essere che quando si divide con una stringa, la probabilità di una suddivisione complessa dell'algoritmo da trattare aumenti significativamente. Per fornire risultati attesi per questi casi, è preferibile che il comportamento del metodo, quando si trovano più delimitatori uno accanto all'altro, sia definito. Ad esempio StringSplitOptions è obbligatorio.

Si potrebbe sostenere che si potrebbe avere un sovraccarico di Split(String, StringSplitOptions), ma come Ilya Ivanov indicato nella risposta di cui sopra, è necessario fermarsi da qualche parte e non v'è un modo perfetto di passare una singola stringa in.

+0

Prima risposta che tratta della mia domanda, e anche buona. Grazie. – GameScripting

+2

Il ['StringSplitOptions'] (http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx) in realtà non è così avanzato, i suoi soli membri sono' None' e 'RemoveEmptyEntries'. – CodeCaster

-2
string input = "This - is - an - example"; 
string[] splitted = Regex.Split(input," - "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 

Non è solo questione di spazi, corrisponde exatcly vostra string separatore, guardare

string input = "This,- is,- a,- complicated,- example"; 
string[] splitted = Regex.Split(input,",- "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 
+1

'Regex' è un mutch più lento di' String.Split' e [non si dovrebbe usare 'Regex' se non si tratta di espressioni regolari] (http://stackoverflow.com/a/2234376/808723). – GameScripting

+1

@GameScripting il link che hai fornito non spiega perché non si dovrebbe usare Regex se non si tratta di espressioni regolari. – Default

+0

@Default Dai un'occhiata ai commenti. Stanno affermando esattamente la stessa cosa. Penso che usare 'Regex' per dividere le stringhe possa [confondere ulteriori sviluppatori] (http://stackoverflow.com/a/1257322/808723) poiché si notano le espressioni regolari. – GameScripting

Problemi correlati