Chciałbym obciąć łańcuch tak, aby jego długość nie była dłuższa niż podana wartość. Piszę do tabeli bazy danych i chcę się upewnić, że wartości, które piszę, spełniają ograniczenie typu danych kolumny.
Na przykład byłoby miło, gdybym mógł napisać:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Niestety powoduje to wyjątek, ponieważ maxLength
generalnie przekracza granice ciągu value
. Oczywiście mógłbym napisać funkcję taką jak poniżej, ale miałem nadzieję, że coś takiego już istnieje.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
Gdzie jest nieuchwytny interfejs API, który wykonuje to zadanie? Czy jest jeden
StringBuilder
pozwala obciąć, zmniejszając długość, ale nadal musisz wykonać kontrolę długości, aby uniknąć poszerzenia łańcucha..Trim()
w sposób, który sprawia, że myląco brzmi, jakby mutował ciąg: „Usuwa wszystkie wiodące i końcowe białe znaki z bieżący obiekt String. ”Odpowiedzi:
Truncate()
Niestety nie ma metody na ciąg znaków. Musisz napisać taką logikę. Możesz jednak zawinąć to w metodę rozszerzenia, abyś nie musiał jej wszędzie kopiować:Teraz możemy napisać:
źródło
maxLength
jest wartością ujemną.Lub zamiast operatora trójskładnikowego możesz użyć Math.min
źródło
value.Substring(0, value.Length)
.maxLength
jest wartością ujemną.maxLength
do0
lubvalue.Length
; lub muszę rzucićArgumentOutOfRangeException
..., co w tym przypadku ma większy sens i jest już wyrzuconeSubstring
.return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
Pomyślałem, że wrzucę swoje wdrożenie, ponieważ uważam, że obejmuje ono wszystkie sprawy, które zostały poruszone przez innych i robi to w zwięzły sposób, który jest nadal czytelny.
To rozwiązanie opiera się głównie na rozwiązaniu Raya i otwiera metodę do zastosowania jako metodę rozszerzenia przy użyciu tego słowa kluczowego, podobnie jak LBushkin w swoim rozwiązaniu.
źródło
maxLength
jest wartością ujemną.Ponieważ testowanie wydajności jest zabawne: (przy użyciu metod rozszerzenia linqpad )
truncate
Metoda była „znacznie” szybciej. #microoptimizationWcześnie
Późno
Za długo
źródło
W .NET 4.0 możesz użyć
Take
metody:Nie przetestowano pod kątem wydajności!
źródło
Możesz użyć LINQ ... eliminuje to konieczność sprawdzania długości łańcucha. Co prawda może nie jest najbardziej wydajny, ale jest fajny.
lub
źródło
Zrobiłem mój w taki sposób
źródło
Wygląda na to, że nikt tego jeszcze nie opublikował:
Użycie operatora && sprawia, że jest on nieznacznie lepszy niż zaakceptowana odpowiedź.
źródło
.NET Framework posiada interfejs API do obcinania takiego łańcucha:
Ale w aplikacji C # prawdopodobnie wolisz tworzyć własne niż polegać na Microsoft.VisualBasic.dll, którego główną racją bytu jest kompatybilność wsteczna.
źródło
Microsoft.VisualBasic.Strings
moduły .NET Core są dość puste .Inne rozwiązanie:
źródło
Wiem, że to stare pytanie, ale oto fajne rozwiązanie:
Zwraca: cześć ...
źródło
Podobny wariant z operatorem propagacji zerowej C # 6
Należy pamiętać, że zasadniczo sprawdzamy, czy tutaj
value
jest dwa razy zerowy.źródło
Nadal nie ma metody obcinania w 2016 r. Dla ciągów C #. Ale - przy użyciu składni C # 6.0:
To działa jak urok:
źródło
Biorąc @CaffGeek i upraszczając go:
źródło
Kndly zauważa, że obcięcie łańcucha nie oznacza po prostu cięcia samego łańcucha o określonej długości, ale należy uważać, aby nie rozdzielić słowa.
np. ciąg: jest to ciąg testowy.
Chcę to wyciąć o 11. Jeśli użyjemy dowolnej z metod podanych powyżej, wynik będzie
to jest te
Nie tego chcemy
Metoda, której używam, może również nie być tak idealna, ale może poradzić sobie z większością sytuacji
źródło
Dlaczego nie:
tj. w polu zdarzeń
value.Length < maxLength
odstępy do końca lub obcięcie nadmiaru.źródło
Na wypadek, gdyby nie było wystarczająco dużo odpowiedzi, oto moje :)
używać:
źródło
Ze względu na (nadmierną) złożoność dodam moją przeciążoną wersję, która zastępuje ostatnie 3 znaki wielokropkiem w odniesieniu do parametru maxLength.
źródło
Moje dwa centy o przykładowej długości 30:
źródło
Wolę odpowiedź jpiersona, ale żaden z przykładów, które widzę, nie obsługuje nieprawidłowego parametru maxLength, na przykład gdy maxLength <0.
Wybierane byłyby albo obsłużyć błąd w try / catch, ustawić parametr maxLength min na 0, lub jeśli maxLength jest mniejszy niż 0, zwrócić pusty ciąg
Niezoptymalizowany kod:
źródło
Oto rozwiązanie vb.net, zaznacz, że instrukcja if (choć brzydka) poprawia wydajność, ponieważ nie potrzebujemy instrukcji substring, gdy łańcuch jest już mniejszy niż maxlength ... Dzięki temu, że jest rozszerzeniem łańcucha, jest łatwy w użyciu. ..
źródło
Wiem, że jest już mnóstwo odpowiedzi, ale potrzebowałem utrzymać nienaruszony początek i koniec łańcucha, ale skrócić go poniżej maksymalnej długości.
Służy to do tworzenia adresów URL programu SharePoint o maksymalnej długości 260 znaków.
Nie ustawiłem długości jako parametru, ponieważ jest to stała 260. Nie uczyniłem też pierwszej długości podłańcucha parametrem, ponieważ chcę, aby pękała w określonym punkcie. Wreszcie drugi podciąg to długość źródła - 20, ponieważ znam strukturę folderów.
Można to łatwo dostosować do konkretnych potrzeb.
źródło
Wiem, że jest tu już mnóstwo odpowiedzi, ale jest to ta, z którą poszedłem, która obsługuje zarówno ciągi zerowe, a sytuacja, w której przekazywana długość jest ujemna:
źródło
W C # 8 można użyć nowej funkcji Ranges ...
źródło
Nic nie wiem o tym w .net - oto moja wersja, która dodaje „...”:
źródło
TruncateString
źródło
Jako dodatek do omówionych powyżej możliwości chciałbym podzielić się moim rozwiązaniem. Jest to metoda rozszerzenia, która pozwala null (zwraca string.Empty), istnieje również druga metoda .Truncate () do używania jej z wielokropkiem. Uwaga, nie jest zoptymalizowana pod kątem wydajności.
źródło
źródło
ToArray()
Wezwanie tutaj jest po prostu niepotrzebny narzut; używając np.String.Concat
możesz skonstruować ciąg znaków z wyliczalnej liczby znaków bez konieczności przechodzenia przez tablicę.Obciąć ciąg
źródło
Oto kod, którego zwykle używam:
źródło