Gostaria de truncar uma string de forma que seu comprimento não exceda um determinado valor. Estou escrevendo em uma tabela de banco de dados e quero garantir que os valores que eu escrevo atendam às restrições do tipo de dados da coluna.
Por exemplo, seria bom se eu pudesse escrever o seguinte:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Infelizmente, isso gera uma exceção, porque maxLength
geralmente excede os limites da string value
. Claro, eu poderia escrever uma função como a seguinte, mas esperava que algo assim já existisse.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
Onde está a API indescritível que executa essa tarefa? Existe um?
StringBuilder
permite truncar encurtando o comprimento, mas você ainda precisa executar a verificação do comprimento para evitar o alargamento da corda..Trim()
de uma maneira que pareça enganosa, pois muda a string: "Remove todos os caracteres de espaço em branco iniciais e finais do objeto String atual. "Respostas:
Truncate()
Infelizmente, não há um método na string. Você precisa escrever esse tipo de lógica. O que você pode fazer, no entanto, é agrupar isso em um método de extensão para que você não precise duplicá-lo em qualquer lugar:Agora podemos escrever:
fonte
maxLength
for um valor negativo.Ou, em vez do operador ternário, você pode usar Math.min
fonte
value.Substring(0, value.Length)
.maxLength
for um valor negativo.maxLength
como padrão0
ouvalue.Length
; ou eu preciso jogar umArgumentOutOfRangeException
... o que faz mais sentido nesse caso, e já é jogado deSubstring
qualquer maneira.return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
Imaginei que lançaria minha implementação, pois acredito que ela cobre todos os casos que foram abordados pelos outros e o faz de uma maneira concisa que ainda é legível.
Essa solução baseia-se principalmente na solução de Ray e abre o método para uso como método de extensão, usando a palavra - chave this, assim como LBushkin em sua solução.
fonte
maxLength
for um valor negativo.Como o teste de desempenho é divertido: (usando métodos de extensão linqpad )
O
truncate
método foi "significativamente" mais rápido. #microoptimizationCedo
Atrasado
Demasiado longo
fonte
No .NET 4.0, você pode usar o
Take
método:Não testado quanto à eficiência!
fonte
Você pode usar o LINQ ... elimina a necessidade de verificar o comprimento da string. É certo que talvez não seja o mais eficiente, mas é divertido.
ou
fonte
Eu fiz o meu em uma linha como esta
fonte
Parece que ninguém postou isso ainda:
O uso do operador && o torna marginalmente melhor que a resposta aceita.
fonte
O .NET Framework possui uma API para truncar uma string como esta:
Mas, em um aplicativo C #, você provavelmente prefere usar o Microsoft.VisualBasic.dll, cuja principal razão de ser é a compatibilidade com versões anteriores.
fonte
Microsoft.VisualBasic.Strings
módulos do .NET Core estão vazios .Outra solução:
fonte
Sei que essa é uma pergunta antiga, mas aqui está uma boa solução:
Retorna: olá ...
fonte
Uma variante semelhante ao operador de propagação nula do C # 6
Observe que estamos essencialmente verificando se
value
é nulo duas vezes aqui.fonte
Ainda não há método Truncar em 2016 para seqüências de caracteres C #. Mas - usando a sintaxe do C # 6.0:
Ele funciona como um encanto:
fonte
Tomando o @CaffGeek e simplificando-o:
fonte
Observe que truncar uma string não significa apenas cortar uma string apenas com um comprimento especificado, mas deve-se tomar cuidado para não dividir a palavra.
eg string: esta é uma string de teste.
Eu quero cortar às 11. Se usarmos algum dos métodos acima, o resultado será
isso é um te
Não é isso que queremos
O método que estou usando também pode não ser tão perfeito, mas pode lidar com a maior parte da situação
fonte
Por que não:
ou seja, nos
value.Length < maxLength
espaços do bloco de eventos até o fim ou truncar o excesso.fonte
Apenas no caso de não haver respostas suficientes aqui, aqui está a minha :)
usar:
fonte
Por uma questão de (excesso) complexidade, adicionarei minha versão sobrecarregada que substitui os últimos 3 caracteres por uma elipse em relação ao parâmetro maxLength.
fonte
Meus dois centavos com exemplo de comprimento de 30:
fonte
Prefiro a resposta de jpierson, mas nenhum dos exemplos aqui que posso ver está lidando com um parâmetro maxLength inválido, como quando maxLength <0.
As opções seriam manipular o erro em uma tentativa / captura, fixe o parâmetro maxLength min a 0 ou, se maxLength for menor que 0, retorne uma sequência vazia.
Código não otimizado:
fonte
Aqui está uma solução vb.net, marque que a instrução if (embora feia) melhora o desempenho, porque não precisamos da instrução substring quando a string já é menor que o comprimento máximo ... Ao torná-la uma extensão da string, é fácil de usar. ..
fonte
Eu sei que já existem muitas respostas, mas minha necessidade era manter intacto o início e o fim da string, mas encurtá-la para o comprimento máximo.
Isso é para criar URLs do SharePoint com um comprimento máximo de 260 caracteres.
Eu não tornei o comprimento um parâmetro, pois é uma constante 260. Também não fiz o primeiro comprimento da substring um parâmetro porque quero que ele quebre em um ponto específico. Finalmente, a segunda substring é o comprimento da fonte - 20 desde que conheço a estrutura da pasta.
Isso pode ser facilmente adaptado às suas necessidades específicas.
fonte
Eu sei que já existem muitas respostas aqui, mas essa é a que eu tenho, que lida com cadeias nulas e a situação em que o comprimento passado é negativo:
fonte
No C # 8, o novo recurso Ranges pode ser usado ...
fonte
Não há nada no .net para isso que eu saiba - aqui está a minha versão que adiciona "...":
fonte
TruncateString
fonte
Como complemento às possibilidades discutidas acima, eu gostaria de compartilhar minha solução. É um método de extensão que permite null (retorna string.Empty) e também existe um segundo .Truncate () para usá-lo com reticências. Cuidado, não é um desempenho otimizado.
fonte
fonte
ToArray()
ligação aqui é apenas desnecessária; usando, por exemplo,String.Concat
você pode construir uma string a partir de um enumerável de caracteres sem ter que passar por uma matriz.Truncar String
fonte
Este é o código que eu costumo usar:
fonte