Eu tenho o seguinte
data.AppendFormat("{0},",dataToAppend);
O problema com isso é que estou usando-o em um loop e haverá uma vírgula de teste. Qual é a melhor maneira de remover a vírgula final?
Eu tenho que alterar os dados para uma string a substring dela?
c#
stringbuilder
Wesley Skeen
fonte
fonte
string.Join(",", yourCollection)
? Editar: adicionado como resposta.Respostas:
A maneira mais simples e eficiente é executar este comando:
ao fazer isso, você move o ponteiro (isto é, o último índice) um caractere para trás, mas não altera a mutabilidade do objeto. Na verdade,
StringBuilder
é melhor limpar umLength
também (mas use oClear()
método para maior clareza, porque é assim que sua implementação se parece):novamente, porque não muda a tabela de alocação. Pense nisso como dizer: não quero mais reconhecer esses bytes. Agora, mesmo quando chama
ToString()
, ele não reconhece nada além de seuLength
, bem, ele não pode. É um objeto mutável que aloca mais espaço do que o fornecido por você; ele é simplesmente construído dessa maneira.fonte
data.Length = 0;
: isso é exatamente o queStringBuilder.Clear
faz, por isso é preferível usarStringBuilder.Clear
para maior clareza de intenção.Clear()
faz, mas coisa engraçada. Essa é a primeira linha doClear()
método. Mas, você sabia que a interface realmente apresenta areturn this;
. Agora é isso que me mata. Definindo asLength = 0
alterações da referência que você já possui, por que voltar você mesmo?Append
retorna a si mesmo também.Apenas use
Dessa forma, você não precisa do
StringBuilder
e do loop.Longa adição sobre o caso assíncrono. A partir de 2019, não é uma configuração rara quando os dados chegam de forma assíncrona.
No caso de seus dados estarem em coleta assíncrona, não há
string.Join
sobrecargaIAsyncEnumerable<T>
. Mas é fácil criar um manualmente, hackeando o código destring.Join
:Se os dados estão chegando de forma assíncrona, mas a interface
IAsyncEnumerable<T>
não é compatível (como o mencionado nos comentáriosSqlDataReader
), é relativamente fácil agrupar os dados emIAsyncEnumerable<T>
:e usá-lo:
Para usar
Select
, você precisará usar o pacote nugetSystem.Interactive.Async
. Aqui você pode encontrar um exemplo compilável.fonte
string.Join(",", yourCollection)
ainda tem um,
no final. portanto, o exemplo acimastring.Join(",", yourCollection)
é ineficiente e não o remove por conta própria.Use o seguinte após o loop.
ou simplesmente mude para
fonte
string.Join(",", input)
Que tal agora..
fonte
Eu prefiro manipular o comprimento do construtor de cordas:
fonte
data.Length--
ou--data.Length
?--
ou++
você pode usardata.Length -= 1
embora, ou esta resposta também funcionará.Eu recomendo, você muda seu algoritmo de loop:
fonte
Você deve usar o
string.Join
método para transformar uma coleção de itens em uma string delimitada por vírgulas. Isso garantirá que não haja vírgulas à esquerda ou à direita, bem como garantirá que a string seja construída de forma eficiente (sem strings intermediárias desnecessárias).fonte
Sim, converta-o em uma string assim que o loop for concluído:
fonte
Você tem duas opções. O primeiro é o
Remove
método de uso muito fácil , é bastante eficaz. A segunda maneira é usarToString
com índice inicial e índice final ( documentação MSDN )fonte
Pergunta semelhante de SO aqui.
Eu gostei de usar um método de extensão StringBuilder.
Método RemoveLast
fonte
A maneira mais simples seria usar o método Join ():
Se você realmente precisa do StringBuilder, apare a vírgula final após o loop:
fonte
data.ToString().TrimEnd(',');
é ineficiente