Em C #, se eu quiser dividir um string
por outro string
, tenho que fazer algo assim:
testString.Split(new string[] { "anotherString" }, StringSplitOptions.None);
Na String.Split
documentação sobrecarregada do MSDN, podemos ver a implementação e por que essa ligação deve ser feita.
Vindo do Python , é difícil para mim entender corretamente por que essa ligação é necessária. Quero dizer, eu poderia usar Regex.Split
para obter uma sintaxe semelhante à implementação do Python, mas precisaria fazê-lo com o custo de menos desempenho (tempo de configuração) para algo simples .
Então, basicamente, minha pergunta é por que diabos não podemos simplesmente fazer:
testString.Split("anotherString");
Observe que não estou sugerindo nenhum protótipo nem implementação. Entendo por que você não conseguiu implementar a versão acima, considerando a API atual. Meu objetivo era entender por que essa API poderia ter sido criada considerando o benefício que a sintaxe acima traz. A partir de agora, a flexibilidade parece ser o objetivo da corrente String.Split
que faz sentido, mas, para ser sincero, realmente pensei que havia algum tipo de ganho de desempenho em algum lugar. Eu acho que estava errado.
fonte
testString.Split(",.;");
etestString.Split(new Char [] {',', '.', ';',);
quais não são a mesma coisa?IEnumerable<char>
para que o protótipo adicional que você está sugerindo possa parecer ambíguo em certos casos (você delimita a string inteira ou delimita cada um de seus caracteres?) Apenas um palpite.testString.Split("anotherString");
, estou bastante confiante em dizer que o comportamento esperado era delimitar toda a string (anotherString
neste caso).Respostas:
Às vezes, a divisão em mais de um caractere / sequência de caracteres é útil; portanto, a API permite que você forneça uma matriz, oferecendo a máxima flexibilidade. No caso de
char
s, você obtém simplicidade de sintaxe e flexibilidade, já que o parâmetro está marcado comoparams
para que você possa escrever emSplit('x')
vez deSplit(new[]{'x'})
.Então, por que não existe uma opção semelhante para strings, permitindo que você escreva
Split("x")
?Essa talvez seja uma consequência infeliz de como a API é projetada. Inicialmente, ele só permitia dividir os caracteres. A divisão em strings foi adicionada na 2.0, provavelmente porque é mais complexa de implementar. Mas não foi possível adicionar
String.Split(string)
ouString.Split(string[])
sobrecarregar, pois isso tornaria a expressãotestString.Split(null)
ambígua e esse código não seria mais compilado.testString.Split(null)
é, na verdade, um idioma bastante comum, pois divide a cadeia de caracteres em espaço em branco; portanto, essa quebra seria muito ampla para ser aceitável.O uso de um
null
parâmetro como uma opção para comportamentos especiais geralmente é considerado um design ruim hoje em dia, por isso acho justo dizer que essa API é falha.Também não existe
Split(string[], Int32)
, provavelmente por uma razão semelhante - seria ambíguoSplit(char[], Int32)
se o primeiro parâmetro fossenull
. Não são sobrecargas semelhantes com osStringSplitOptions
parâmetros, mas estes foram todos adicionados ao mesmo tempo em 2,0, então há ambiguidade foi introduzido no código existente.Nota
Para deixar claro, esta é apenas minha hipótese, não conheço o pensamento real dos designers de estrutura .net.
fonte
Split(null)
é inútil se você permitirSplit("")
. Além do fato de que ele iria permitir uma melhor forma de sintaxe, o último é mais detalhado de qualquer maneira ...String.Split(null)
não seria mais ambígua, para que eles pudessem adicionar a sobrecargaNão sendo o autor dos métodos, não sei por que esse conjunto de sobrecargas foi escolhido. No entanto, há duas coisas a serem observadas aqui:
Se você estiver dividindo em um único caractere, a
public string[] Split(params char[] separator
versão) poderá ser usada assim:como o
char[]
é umparams
parâmetroVocê pode adicionar facilmente seu próprio método de extensão aqui para obter o que deseja:
e agora
testString.Split("anotherString");
funcionará para você.fonte
String
classe, ambos seriam possíveis. Estou errado ?Idiomas diferentes têm regras um pouco diferentes para conversões implícitas e sobrecargas, e o .NET Framework foi projetado para ser usado com qualquer um deles. No
Option Strict Off
dialeto do VB.NET, um valor do tipoString
pode ser passado para uma função que espera umChar[]
comportamento equivalente a chamarToCharArray()
a string.Eu acho que a coisa mais sensata a fazer seria ter nomes separados para
Split
(que aceita um únicoChar
ouString
) eSplitMulti
(que aceitaria umChar[]
ouString[]
), mas o .NET às vezes parece preferir usar a sobrecarga sozinho para escolher diferentes tipos de operações. Infelizmente, não conheço nenhuma maneira de usarString.Split
para acomodar quaisquer cenários de uso que exijam a distinção de diferentes tipos de delimitadores que não sejam divididos separadamente em cada um.Outra omissão é uma opção para preservar delimitadores, incluindo-os no final da sequência anterior ou no início da sequência seguinte, ou com elementos de matriz com números ímpares serem delimitadores, enquanto elementos com números pares são o que há entre eles.
fonte