Gostaria de escrever um método de extensão para a String
classe, para que, se a string de entrada for maior que o comprimento fornecido N
, apenas os primeiros N
caracteres sejam exibidos.
Veja como fica:
public static string TruncateLongString(this string str, int maxLength)
{
if (str.Length <= maxLength)
return str;
else
//return the first maxLength characters
}
Qual String.*()
método posso usar para obter apenas os primeiros N
caracteres str
?
startIndex > (this.Length - length)
joga umArgumentOutOfRangeException
.Math.Min(str.Length, maxLength) == str.Length
no caso de você acabar criando uma string desnecessária para retornar "os primeiros str.Length caracteres de str", mas o Substring verifica isso para você e o faz apenasreturn this
se você tiver solicitado a string inteira.Essa solução tem um pequeno bônus, pois se n for maior que s.Length, ainda assim fará a coisa certa.
fonte
Você pode usar o LINQ
str.Take(n)
oustr.SubString(0, n)
, onde o último lançará umaArgumentOutOfRangeException
exceção paran > str.Length
.Mente que a versão LINQ retorna um
IEnumerable<char>
, então você teria que converter aIEnumerable<char>
parastring
:new string(s.Take(n).ToArray())
.fonte
Sempre que tenho que fazer manipulações de strings em C #, sinto falta do bom
Left
e velhoRight
funções do Visual Basic, que são muito mais simples de usar do queSubstring
.Portanto, na maioria dos meus projetos em C #, crio métodos de extensão para eles:
Nota:
A
Math.Min
peça está lá porqueSubstring
lança umArgumentOutOfRangeException
quando o comprimento da string de entrada é menor que o tamanho solicitado, como já mencionado em alguns comentários nas respostas anteriores.Uso:
fonte
public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
str
precisa ser verificado para nuloSimplesmente:
fonte
fonte
str == null || str.Length <= maxLength
Remove
ouSubstring
não melhor, não há diferença.Remove(maxLength)
apenas chamaSubstring(0,maxLength)
depois de um pouco de verificação de limites. O que você prefere depende se você considera o truncamento como "pegue os primeiros caracteres maxLength" ou "jogue fora tudo depois dos caracteres maxLength". Claro, são realmente as duas coisas, então depende de você.se estamos falando de validações, também porque não verificamos entradas de sequência nula. Alguma razão específica?
Acho que ajuda abaixo, uma vez que IsNullOrEmpty é um método definido pelo sistema e operadores ternários têm complexidade ciclomática = 1 enquanto if () {} else {} tem o valor 2.
fonte
Eu adicionei isso no meu projeto apenas porque, onde estou usando, há uma grande chance de ser usado em loops, em um projeto hospedado on-line, portanto, eu não queria nenhuma falha se pudesse gerenciá-lo. O comprimento se encaixa em uma coluna que tenho. É C # 7
Apenas uma linha:
fonte
O método .NET Substring está cheio de perigos. Desenvolvi métodos de extensão que lidam com uma grande variedade de cenários. O bom é que ele preserva o comportamento original, mas quando você adiciona um parâmetro "true" adicional, ele recorre ao método de extensão para manipular a exceção e retorna os valores mais lógicos, com base no índice e no comprimento. Por exemplo, se o comprimento for negativo e conta para trás. Você pode ver os resultados do teste com grande variedade de valores no violino em: https://dotnetfiddle.net/m1mSH9 . Isso lhe dará uma idéia clara de como ele resolve substrings.
Eu sempre adiciono esses métodos a todos os meus projetos e nunca preciso me preocupar com quebra de código, porque algo mudou e o índice é inválido. Abaixo está o código.
Eu escrevi sobre isso em maio de 2010 em: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html
fonte
Parcialmente para fins de resumo (excluindo a solução LINQ), eis duas linhas que abordam a
int maxLength
ressalva de permitir valores negativos e também o caso da cadeia nula:Substring
caminho ( da resposta de Paul Ruane ):Remove
caminho ( da resposta de kbrimington ):fonte
fonte
string.Substring (0, n); // 0 - índice inicial e n - número de caracteres
fonte