Qual é a melhor maneira de gerar uma sequência de \t
's em c #
Estou aprendendo c # e experimentando maneiras diferentes de dizer a mesma coisa.
Tabs(uint t)
é uma função que retorna a string
com t
quantidade de \t
's
Por exemplo, Tabs(3)
retorna"\t\t\t"
Qual dessas três maneiras de implementar Tabs(uint numTabs)
é a melhor?
Claro que isso depende do que "melhor" significa.
A versão do LINQ é de apenas duas linhas, o que é legal. Mas as chamadas para Repetir e Agregar desnecessariamente consomem tempo / recursos?
A
StringBuilder
versão é muito clara, mas aStringBuilder
classe é de alguma forma mais lenta?A
string
versão é básica, o que significa que é fácil de entender.Isso não importa? Eles são todos iguais?
Essas são perguntas para me ajudar a ter uma idéia melhor do C #.
private string Tabs(uint numTabs)
{
IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : "";
}
private string Tabs(uint numTabs)
{
StringBuilder sb = new StringBuilder();
for (uint i = 0; i < numTabs; i++)
sb.Append("\t");
return sb.ToString();
}
private string Tabs(uint numTabs)
{
string output = "";
for (uint i = 0; i < numTabs; i++)
{
output += '\t';
}
return output;
}
Devoluções
E
Devoluções
de...
Existe uma função interna para repetir string ou char no .net?
fonte
StruingBuilder
!string.Join
foi mais rápido no exemplo, porque eles estavam usando um delimitador de espaço.string.Concat
é apropriado quando não há delimitador.Em todas as versões do .NET, você pode repetir uma string assim:
Repetir um personagem
new String('\t', count)
é a sua melhor aposta. Veja a resposta do @CMS .fonte
A melhor versão é certamente usar da maneira integrada:
Das outras soluções, prefira as mais fáceis; somente se isso estiver muito lento, lute por uma solução mais eficiente.
Se você usa umBobagem: é claro que o código acima é mais eficiente.StringBuilder
e conhece seu comprimento resultante com antecedência, também usa um construtor apropriado, isso é muito mais eficiente, pois significa que apenas uma alocação demorada ocorre e nenhuma cópia desnecessária de dados.fonte
new string('\t', len)
estar entre 2x e 7x mais rápidos que aStringBuilder
abordagem. Por que você acha queStringBuilder
é mais eficiente nesse caso?Métodos de extensão:
fonte
Enumerable.Range(0, n).SelectMany(x => s)
pode ser substituído por um simplesEnumerable.Repeat(s, n)
.SelectMany
vontade de cada manequim únicox
fornece uma sequência dechar
valores (desde osstring s
implementosIEnumerable<char>
) e todas essaschar
sequências são concatenadas em umachar
sequência longa . O que você sugere dará umIEnumerable<string>
. Não é o mesmo.Enumerable.Repeat
, eu teria que concatenar as cordas em conjunto:string.Concat(Enumerable.Repeat(s, n))
. Isso já foi publicado antes .Que tal usar o método de extensão?
Você pode então escrever:
Observe que um teste de desempenho do uso da versão stringbuilder para caracteres simples em vez de seqüências de caracteres fornece uma grande penalidade de desempenho: no meu computador, a diferença no desempenho medido é 1:20 entre: Debug.WriteLine ('-'. Repeat (1000000)) // versão char e
Debug.WriteLine ("-". Repeat (1000000)) // string version
fonte
StringBuilder.Insert(Int32, String, Int32)
, como Binoj Anthony respondeu .Que tal agora:
fonte
new string('\t', 10)
para ser a melhor soluçãoEu sei que essa pergunta já tem cinco anos, mas existe uma maneira simples de repetir uma string que até funciona no .Net 2.0.
Para repetir uma sequência:
Devoluções
Para repetir uma sequência como uma matriz:
Devoluções
Mantenha simples.
fonte
Digamos que você queira repetir '\ t' n número de vezes, você pode usar;
fonte
Seu primeiro exemplo que usa
Enumerable.Repeat
:pode ser reescrito de forma mais compacta com
String.Concat
:fonte
Usando
String.Concat
eEnumerable.Repeat
que será mais barato do que usarString.Join
fonte
fonte
A resposta realmente depende da complexidade que você deseja. Por exemplo, quero delinear todos os meus recuos com uma barra vertical, para que minha cadeia de recuos seja determinada da seguinte maneira:
fonte
E ainda outro método
fonte
StringBuilder
construtor salva a realocação. Ainda assim, isso é mais falador e menos eficiente do que usar ostring
construtor que pode repetir um determinado caractere, como já mostrado na resposta aceita.Para mim está bem:
fonte
Você pode criar um método de extensão
Então você pode usá-lo assim
fonte
Sem dúvida, a resposta aceita é a melhor e mais rápida maneira de repetir um único caractere.
A resposta de Binoj Anthony é uma maneira simples e bastante eficiente de repetir uma string.
No entanto, se você não se importa com um pouco mais de código, pode usar minha técnica de preenchimento de matriz para criar essas seqüências com eficiência ainda mais rapidamente. Nos meus testes de comparação, o código abaixo é executado em cerca de 35% do tempo do código StringBuilder.Insert.
Para saber mais sobre esta técnica de preenchimento de matriz, consulte Maneira mais rápida de preencher uma matriz com um único valor
fonte
Tente o seguinte:
fonte
Embora muito parecido com uma sugestão anterior, eu gosto de simplificar e aplicar o seguinte:
Standard .Net realmente,
fonte