Chciałbym napisać metodę rozszerzenia do String
klasy, aby jeśli ciąg wejściowy był dłuższy niż podana długość N
, wyświetlane były tylko pierwsze N
znaki.
Oto jak to wygląda:
public static string TruncateLongString(this string str, int maxLength)
{
if (str.Length <= maxLength)
return str;
else
//return the first maxLength characters
}
Jakiej String.*()
metody mogę użyć, aby uzyskać tylko pierwsze N
znaki str
?
startIndex > (this.Length - length)
rzucaArgumentOutOfRangeException
.Math.Min(str.Length, maxLength) == str.Length
na wypadek, gdybyś nie utworzył niepotrzebnego ciągu, aby zwrócić „pierwsze znaki str. Długości znaków str”, ale Substring sprawdzi to za ciebie i zrobi to tylkoreturn this
wtedy, gdy poprosisz o cały ciąg.To rozwiązanie ma niewielką zaletę, ponieważ jeśli n jest większe niż s.Length, nadal robi to dobrze.
źródło
Możesz użyć LINQ
str.Take(n)
lubstr.SubString(0, n)
, jeśli ten ostatni zgłosiArgumentOutOfRangeException
wyjątekn > str.Length
.Pamiętać, że wersja LINQ zwraca
IEnumerable<char>
, więc trzeba by przekonwertowaćIEnumerable<char>
dostring
:new string(s.Take(n).ToArray())
.źródło
Ilekroć muszę wykonywać operacje na łańcuchach w C #, tęsknię za starym dobrym
Left
iRight
funkcjami Visual Basic, które są znacznie prostsze w użyciu niżSubstring
.Dlatego w większości moich projektów w języku C # tworzę dla nich metody rozszerzeń:
Uwaga: część jest tam, ponieważ rzuca gdy długość ciągu wejściowego jest mniejszy niż żądanej długości, jak już wspomniano w niektórych komentarzach pod poprzednimi odpowiedziami.
Math.Min
Substring
ArgumentOutOfRangeException
Stosowanie:
źródło
public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
str
należy sprawdzić, czy nie ma wartości nullPo prostu:
źródło
źródło
str == null || str.Length <= maxLength
Remove
czySubstring
jest lepsza, nie ma różnicy.Remove(maxLength)
po prostu dzwoniSubstring(0,maxLength)
po sprawdzeniu granic. To, co wolisz, zależy od tego, czy myślisz o obcięciu jako o „weź pierwsze znaki maxLength” czy „wyrzuć wszystko po znakach maxLength”. Oczywiście, to naprawdę oba, więc to zależy od ciebie.jeśli mówimy o sprawdzaniu poprawności, to dlaczego nie sprawdziliśmy, czy nie ma pozycji pustych. Jakieś konkretne powody?
Myślę, że poniżej sposób pomocy, ponieważ IsNullOrEmpty jest metodą zdefiniowaną przez system, a operatory trójskładnikowe mają cykliczną złożoność = 1, podczas gdy if () {} else {} ma wartość 2.
źródło
Dodałem to do mojego projektu tylko dlatego, że tam, gdzie go używam, jest duża szansa, że zostanie on użyty w pętlach, w projekcie prowadzonym online, dlatego nie chciałem żadnych awarii, gdybym mógł to zarządzać. Długość pasuje do kolumny, którą mam. To jest C # 7
Tylko jedna linia:
źródło
Metoda .NET Substring jest pełna niebezpieczeństw. Opracowałem metody rozszerzeń, które obsługują wiele różnych scenariuszy. Zaletą jest to, że zachowuje oryginalne zachowanie, ale po dodaniu dodatkowego parametru „true” następnie stosuje metodę rozszerzenia do obsługi wyjątku i zwraca najbardziej logiczne wartości, w oparciu o indeks i długość. Na przykład, jeśli długość jest ujemna i liczy się wstecz. Możesz zobaczyć wyniki testu z szeroką gamą wartości na skrzypcach pod adresem : https://dotnetfiddle.net/m1mSH9 . To da ci jasny obraz tego, jak rozwiązuje podciągi.
Zawsze dodaję te metody do wszystkich moich projektów i nigdy nie muszę się martwić o złamanie kodu, ponieważ coś się zmieniło, a indeks jest nieprawidłowy. Poniżej znajduje się kod.
Napisałem o tym na blogu w maju 2010 r. Pod adresem: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html
źródło
Częściowo ze względu na podsumowanie (z wyłączeniem rozwiązania LINQ), oto dwie jednowierszowe, które rozwiązują problem
int maxLength
dopuszczenia wartości ujemnych, a także przypadku łańcucha zerowego:Substring
Sposób (z odpowiedzią Paul Ruane użytkownika ):Remove
Sposób (z odpowiedzią kbrimington użytkownika ):źródło
źródło
string.Substring (0, n); // 0 - indeks początkowy in - liczba znaków
źródło