Excluir último caractere de string

260

Estou recuperando muitas informações de uma lista, vinculadas a um banco de dados e desejo criar uma sequência de grupos, para alguém conectado ao site.

Eu uso isso para testar, mas isso não é dinâmico, por isso é muito ruim:

string strgroupids = "6";

Eu quero usar isso agora. Mas a string retornada é algo como1,2,3,4,5,

groupIds.ForEach((g) =>
{
    strgroupids = strgroupids  + g.ToString() + ",";
    strgroupids.TrimEnd(',');
});

strgroupids.TrimEnd(new char[] { ',' });

Eu quero excluir o ,após o, 5mas definitivamente não está funcionando.

Kiwimoisi
fonte
9
A solução para o problema direto é strgroupids = strgroupids.TrimEnd(new char[] { ',' });que existem idéias melhores abaixo.
Henk Holterman

Respostas:

613
strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

String.Remove (Int32):

Exclui todos os caracteres dessa sequência, começando em uma posição especificada e continuando até a última posição

sll
fonte
1
Perfeito para remover o último caractere se você deseja remover o último caractere. Para a pergunta do OP, o problema não deve existir se você não criar um caractere final. Verifique a solução @ Øyvind Bråthen se você estiver no barco da OP.
aloisdg movendo-se para codidact.com 06/06
86

Que tal fazer dessa maneira

strgroupids = string.Join( ",", groupIds );

Um muito mais limpo.

Anexará todos os elementos internos groupIdscom um ','entre cada, mas não colocará um ','no final.

Øyvind Bråthen
fonte
4
Somente em C # 4.0. No C # 3.5, você terá que converter groupIds em array.
Xanatos # 26/11
3
Este irá corrigir o problema do OP.
aloisdg movendo-se para codidact.com 06/06
29

Strings em c # são imutáveis. Quando você faz o seu código strgroupids.TrimEnd(',');ou strgroupids.TrimEnd(new char[] { ',' });a strgroupidsstring não é modificada .

Você precisa fazer algo parecido strgroupids = strgroupids.TrimEnd(',');.

Para citar aqui :

As strings são imutáveis ​​- o conteúdo de um objeto de string não pode ser alterado após a criação do objeto, embora a sintaxe faça com que pareça que você pode fazer isso. Por exemplo, quando você escreve esse código, o compilador realmente cria um novo objeto de seqüência de caracteres para armazenar a nova sequência de caracteres e esse novo objeto é atribuído a b. A sequência "h" é qualificada para a coleta de lixo.

Andy Johnson
fonte
11

Adicione um método de extensão.

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

então use:

yourString.RemoveLast(",");
nznoor
fonte
A idéia básica de criar um método de extensão é boa. No entanto, IMHO, o método implementado aqui é um exagero, para este uso. O OP sabia que o personagem que ele queria estava no final da sequência, portanto, não há razão para ter o custo de pesquisar por essa sequência, via LastIndexOf. Basta pegar a resposta aceita e torná-la um método de extensão. Ou generalize essa resposta, passando int no número de caracteres a serem removidos no final. Segundo, você testa o comprimento zero, mas isso não elimina todas as exceções possíveis. Seria melhor fazer int index = ..LastIndexOf.., então if (index >= 0).
precisa saber é o seguinte
Terceiro, o parâmetro não string charactertem nome. Quarto, não é imediatamente óbvio para futuros programadores que isso está removendo caracteres no final da string. Oh espere, não é necessariamente fazê-lo. Está pesquisando a string. Poderia estar removendo de algum lugar no meio. Agora, o programador de manutenção precisa examinar todos os usos do método, para ver o que estava tentando ser realizado. Não é um bom método para chamar, por essa simples necessidade de remover do final de uma string. Desculpe por todas as críticas; Faço isso para quem adota esse método, para que eles entendam.
Página
Quinto, no contexto da pergunta, String.TrimEndseria mais apropriado usar. Mas espere, isso já existe - e foi mencionado na pergunta original e em várias outras respostas há 3 anos - não há necessidade de inventar um novo método! Qual é o benefício da sua abordagem?
precisa
7

Remove as vírgulas finais:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Isso é inverso, você escreveu o código que adiciona a vírgula em primeiro lugar. Você deve usar string.Join(",",g), assumindo que gé a string[]. Dê um nome melhor do que gtambém!

Kieren Johnstone
fonte
4

Como alternativa à adição de vírgula para cada item, você pode apenas usar String.

var strgroupids = String.Join(",",  groupIds);

Isso adicionará o separador ("," nesta instância) entre cada elemento na matriz.

Gary.S
fonte
3
string strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    strgroupids = strgroupids + g.ToString() + ",";
});

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Observe que o uso ForEachaqui é normalmente considerado "errado" (leia, por exemplo, http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Usando alguns LINQ:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

Sem substring final:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));
xanatos
fonte
1
@KierenJohnstone string.Joiné perfeito se você tem uma matriz de strings como fonte ou você tem C # 4.0
Xanatos
3

Adicional à solução da sll: É melhor aparar a corda caso haja alguns espaços em branco no final.

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);
tanzer
fonte
2

string.Joiné melhor, mas se você realmente quer um LINQ ForEach:

var strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    if(strgroupids != string.Empty){
        strgroupids += ",";
    }

    strgroupids += g;
});

Algumas notas:

  • string.Joine foreachsão melhores do que essa abordagem, muito mais lenta
  • Não é necessário remover o último, ,pois ele nunca é anexado
  • O operador de incremento ( +=) é útil para anexar a strings
  • .ToString() é desnecessário, pois é chamado automaticamente ao concatenar não-strings
  • Ao manusear cordas grandes, StringBuilderdeve ser considerado em vez de concatenar as cordas

fonte
1
Erro - precisa reverter o teste if - deve serif(strgroupids != string.Empty){
ToolmakerSteve
Mas obrigado por adicionar uma resposta que mostre como usar for-each para criar a string sem o "," indesejado no final! Note que não é necessário fazer um lambda e ForEach; foreach (var g in groupIds) {funciona tão bem :)
ToolmakerSteve
n1 @ToolmakerSteve, sobre o LINQ, então é o código PO Tomei