Jaki jest najlepszy sposób na wygenerowanie ciągu \t
w C #
Uczę się języka C # i eksperymentuję z różnymi sposobami mówienia tego samego.
Tabs(uint t)
Jest to funkcja, która zwraca string
z t
ilością \t
„S
Na przykład Tabs(3)
zwraca"\t\t\t"
Który z tych trzech sposobów wdrożenia Tabs(uint numTabs)
jest najlepszy?
Oczywiście zależy to od tego, co oznacza „najlepszy”.
Wersja LINQ to tylko dwie linie, co jest miłe. Ale czy wezwania do powtarzania i agregowania niepotrzebnie pochłaniają czas / zasoby?
StringBuilder
Wersja jest bardzo jasne, ale toStringBuilder
klasa jakoś wolniej?string
Wersja podstawowa, co oznacza, że jest łatwe do zrozumienia.Czy to w ogóle nie ma znaczenia? Czy wszystkie są równe?
To są wszystkie pytania, które pomogą mi lepiej poznać 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;
}
Zwroty
I
Zwroty
od...
Czy jest wbudowana funkcja powtarzania łańcucha lub znaku w .net?
źródło
StruingBuilder
!string.Join
był szybszy w tym przykładzie, ponieważ używali separatora spacji.string.Concat
jest odpowiedni, gdy nie ma ogranicznika.We wszystkich wersjach .NET możesz powtórzyć ciąg w ten sposób:
Powtarzanie postaci
new String('\t', count)
jest najlepszym wyborem. Zobacz odpowiedź @CMS .źródło
Najlepszą wersją jest z pewnością użycie wbudowanego sposobu:
Spośród innych rozwiązań preferuj najłatwiejsze; tylko jeśli okaże się to zbyt wolne, staraj się znaleźć bardziej wydajne rozwiązanie.
Jeśli użyjeszBzdury: oczywiście powyższy kod jest bardziej wydajny.StringBuilder
i znasz z góry jego wynikową długość, użyj również odpowiedniego konstruktora, jest to o wiele bardziej wydajne, ponieważ oznacza, że ma miejsce tylko jeden czasochłonny przydział i nie ma potrzeby niepotrzebnego kopiowania danych.źródło
new string('\t', len)
od 2x do 7x szybsze niżStringBuilder
podejście. Jak myślisz, dlaczegoStringBuilder
w tym przypadku jest bardziej wydajny?Metody rozszerzenia:
źródło
Enumerable.Range(0, n).SelectMany(x => s)
można zastąpić prostymEnumerable.Repeat(s, n)
.SelectMany
Będzie dla każdego pojedynczego manekinax
otrzymując sekwencjichar
wartości (odstring s
narzędziIEnumerable<char>
), a wszystkie techar
sekwencje są łączone z jednej długiejchar
sekwencji. To, co sugerujesz, daIEnumerable<string>
. To nie jest to samo.Enumerable.Repeat
, musiałbym łączyć ciągi razem:string.Concat(Enumerable.Repeat(s, n))
. To już zostało opublikowane .Co z użyciem metody rozszerzenia?
Możesz wtedy napisać:
Zauważ, że test wydajności użycia wersji programu budującego ciąg dla prostych znaków zamiast ciągów daje dużą karę za wydajność: na moim komputerze różnica mierzonej wydajności wynosi 1:20 pomiędzy: Debug.WriteLine ('-'. Powtórz (1000000)) // wersja char i
Debug.WriteLine („-”. Powtórz (1000000)) // wersja string
źródło
StringBuilder.Insert(Int32, String, Int32)
, jak odpowiedział Binoj Anthony .Co powiesz na to:
źródło
new string('\t', 10)
to najlepsze rozwiązanieWiem, że to pytanie ma już pięć lat, ale istnieje prosty sposób na powtórzenie ciągu znaków, który działa nawet w .Net 2.0.
Aby powtórzyć ciąg:
Zwroty
Aby powtórzyć ciąg jako tablicę:
Zwroty
Nie komplikuj.
źródło
Powiedzmy, że chcesz powtórzyć „\ t” n razy, możesz użyć;
źródło
Twój pierwszy przykład, który wykorzystuje
Enumerable.Repeat
:można napisać bardziej kompaktowo za pomocą
String.Concat
:źródło
Korzystanie
String.Concat
iEnumerable.Repeat
które będzie tańsze niż korzystanieString.Join
źródło
źródło
Odpowiedź naprawdę zależy od wymaganej złożoności. Na przykład chcę obrysować wszystkie moje wcięcia pionowym paskiem, więc mój ciąg wcięcia jest określany w następujący sposób:
źródło
I jeszcze jedna metoda
źródło
StringBuilder
konstruktorowi oszczędza realokacji. Jest to jednak bardziej gadatliwe i mniej wydajne niż użyciestring
konstruktora, który może powtórzyć dany znak, jak już pokazano w zaakceptowanej odpowiedzi.Dla mnie jest w porządku:
źródło
Możesz utworzyć metodę rozszerzenia
Następnie możesz użyć tego w ten sposób
źródło
Bez wątpienia przyjęta odpowiedź jest najlepszym i najszybszym sposobem na powtórzenie jednego znaku.
Odpowiedź Binoj Anthony'ego to prosty i dość skuteczny sposób na powtórzenie łańcucha.
Jeśli jednak nie przeszkadza ci trochę więcej kodu, możesz użyć mojej techniki wypełniania tablic, aby efektywnie tworzyć te ciągi jeszcze szybciej. W moich testach porównawczych poniższy kod został wykonany w około 35% czasu kodu StringBuilder.Insert.
Aby uzyskać więcej informacji na temat tej techniki wypełniania tablicy, zobacz Najszybszy sposób wypełnienia tablicy jedną wartością
źródło
Spróbuj tego:
źródło
Chociaż bardzo podobna do poprzedniej sugestii, lubię ją upraszczać i stosować następujące zasady:
Standardowo .Net naprawdę,
źródło