Jak zdobyć pierwsze pięć znaków String


135

Przeczytałem to pytanie, aby uzyskać pierwszy znak ciągu. Czy istnieje sposób, aby uzyskać pierwszą liczbę n znaków z ciągu w C #?


Poprzednie pytanie dotyczy char** postaci, a ty dotyczy ** postaci . To nie to samo. 𣊾i 𣇞są dwoma znakami, których potrzebowałem wczoraj, które zawiodły w oprogramowaniu napisanym w C #, którego używałem, ponieważ programista nie znał różnicy między a chari znakiem. Nie wpadnij w tę pułapkę!
hippietrail

Odpowiedzi:


221

Możesz użyć Enumerable .

char[] array = yourStringVariable.Take(5).ToArray();

Lub możesz użyć String.Substring .

string str = yourStringVariable.Substring(0,5);

Pamiętaj, że String.Substringmoże zgłosić wyjątek w przypadku, gdy długość łańcucha jest mniejsza niż wymagane znaki.

Jeśli chcesz otrzymać wynik z powrotem w postaci ciągu, możesz użyć:

  • Korzystanie z konstruktora ciągów i LINQ Take

    string firstFivChar = new string(yourStringVariable.Take(5).ToArray());
    

Plusem tego podejścia nie jest sprawdzenie długości przed ręką.

  • Innym sposobem jest użycie String.Substringze sprawdzaniem błędów

lubić:

string firstFivCharWithSubString = 
    !String.IsNullOrWhiteSpace(yourStringVariable) && yourStringVariable.Length >= 5
    ? yourStringVariable.Substring(0, 5)
    : yourStringVariable;

3
string val = new string (yourStringVariable.Take (6) .ToArray ()); ale podłańcuch będzie błąd, jeśli długość zmiennej yourStringVariable jest mniejsza niż 5
Moji,

1
IsNullOrWhiteSpacejest źle tutaj. Rozważ łańcuch z 10 spacjami - Twój kod zwróci wszystkie 10. IsNullOrEmptyZamiast tego użyj . (Nie jest dobre łączenie IsNullOrWhiteSpacez jakimkolwiek innym testem; Zamiast tego przetestuj pod kątem null + pustego, a następnie Trimjeśli jest to określone zachowanie, wykonaj wszystkie potrzebne testy / operacje.)
ToolmakerSteve

1
Możesz zapisać wywołanie ToArray () używając String.Concat () w następujący sposób: string firstFivChar = String.Concat (yourStringVariable.Take (5));
BlueFuzzyThing

50

Proszę spróbować:

yourString.Substring(0, 5);

Sprawdź C # Substring , String.Substring Method


Spowoduje to przejście przez wyjątek, jeśli długość yourStringjest mniejsza niż 5. Aby uniknąć wyjątku, możemy zastosować podciąg oparty na warunku, na przykład:yourString.Length <= 5 ? yourString : yourString.Substring(0, 5)
Zaheer

38

Możesz użyć Substring (int startIndex, int length)

string result = str.Substring(0,5);

Podciąg zaczyna się w określonej pozycji znaku i ma określoną długość. Ta metoda nie modyfikuje wartości bieżącego wystąpienia. Zamiast tego zwraca nowy ciąg o długości znaków, zaczynając od pozycji startIndex w bieżącym ciągu, MSDN

A jeśli łańcuch źródłowy ma mniej niż pięć znaków? Otrzymasz wyjątek, używając powyższej metody. Możemy postawić warunek, aby sprawdzić, czy liczba znaków w ciągu jest większa niż 5, a następnie pobierz pierwsze pięć przez podłańcuch. Uwaga Przypisałem ciąg źródłowy do zmiennej firstFiveChar. FirstFiveChar nie zmienia się, jeśli liczba znaków jest mniejsza niż 5, więc w przeciwnym razie część nie jest wymagana.

string firstFiveChar = str;
If(!String.IsNullOrWhiteSpace(yourStringVariable) && yourStringVariable.Length >= 5)
      firstFiveChar = yourStringVariable.Substring(0, 5);

31

Nikt nie wspomniał, jak prawidłowo sprawdzać podczas używania Substring(), więc chciałem się nad tym przyczynić.

Jeśli nie chcesz używać Linqi iść z Substring(), musisz upewnić się, że twój ciąg jest większy niż drugi parametr (długość) Substring()funkcji.

Powiedzmy, że potrzebujesz pierwszych 5 znaków. Powinieneś je otrzymać z odpowiednim sprawdzeniem, takim jak ten:

string title = "love" // 15 characters
var firstFiveChars = title.Length <= 5 ? title : title.Substring(0, 5);

// firstFiveChars: "love" (4 characters)

Bez tego sprawdzenia Substring()funkcja zgłosiłaby wyjątek, ponieważ iterowałaby przez litery, których nie ma.

Myślę, że masz pomysł ...


urocza dodatkowa informacja
Rob85,

Cieszę się, że Ci się podobało.
ilter

To mi bardzo pomogło, ale czy mógłbyś wyjaśnić, co dokładnie robi w tej linii?
jimbob

Chciałbym sprawdzić kilka przykładów dotyczących podciągu. Pobiera parametry dla indeksów. Indeks początkowy to 0. Jeśli napiszesz coś większego (lub mniejszego) niż ostatni indeks dowolnej tablicy, otrzymasz wyjątek poza indeksem. Ta kontrola w tym przykładzie służy uniknięciu tego wyjątku.
ilter

Hahhahaha! :) To było pytanie, na które odpowiedziałem. Czy powinienem pozostawić to pytanie bez odpowiedzi? :)
ilter

18

Problem .Substring(,)polega na tym, że musisz mieć pewność, że podany ciąg ma długość co najmniej zadanej liczby znaków, w przeciwnym razie ArgumentOutOfRangeExceptionzostanie wyrzucony znak .

Rozwiązanie 1 (używając „Podłańcuch”):

var firstFive = stringValue != null ? 
                   stringValue.Substring(0, stringValue.Length >= 5 ? 5 : stringValue.Length) :
                   null;

Wadą używania .Substring(jest to, że musisz sprawdzić długość podanego ciągu.

Rozwiązanie 2 (używając „Take”):

var firstFive = stringValue != null ? 
                    string.Join("", stringValue.Take(5)) : 
                    null;

Użycie „Take” zapobiega konieczności sprawdzania długości podanego ciągu.


13

Użyj funkcji PadRight, aby zapobiec zbyt krótkiemu łańcuchowi, weź to, czego potrzebujesz, a następnie przytnij spacje od końca w jednej instrukcji.

strSomeString = strSomeString.PadRight(50).Substring(0,50).TrimEnd();

1
Jak dotąd jest to lepsze rozwiązanie. Użycie tylko podłańcucha może spowodować błąd, gdy długość łańcucha jest mniejsza niż długość podciągu.
Asiri Dissanayaka

najlepsza alternatywa dla funkcji LEFT, której używamy w SQL Server
vibs2006

12

Nie wiem, dlaczego ktoś o tym wspomniał. Ale to najkrótsza i najłatwiejsza droga do osiągnięcia tego.

string str = yourString.Remove(n);

n - liczba potrzebnych znaków

Przykład

var zz = "7814148471";
Console.WriteLine(zz.Remove(5));
//result - 78141

3
Jest to wewnętrznie to samo, co „this.Substring (0, 5)”, więc musisz upewnić się, że ciąg ma odpowiednią długość.
PersyJack

W przypadku, gdy chcesz pierwszych n znaków, działa to tylko wtedy, gdy znasz długość ciągu. Jeśli długość może się zmienić, nie zawsze będzie to działać. Wiem, że jest to prawdopodobnie oczywiste dla większości, ale
wspomnę

10

Dołącz pięć białych znaków, a następnie odetnij pierwsze pięć i przytnij wynik. Liczba dodanych spacji powinna odpowiadać liczbie wycinanej. Pamiętaj, aby wcześniej dodać nawias, w .Substring(0,X)przeciwnym razie nic nie zostanie dodane.

string str = (yourStringVariable + "    ").Substring(0,5).Trim();

Dzięki tej technice nie będziesz musiał martwić się o ArgumentOutOfRangeExceptionwspomniane w innych odpowiedziach.


1
cholera, miałem zamiar to opublikować !! głosowano. (jest rok 2019, dlaczego nie może istnieć metoda na łańcuchu, która robi to, co zrobił Mid $ w 1985? Dla tych, którzy mówią `` nie powinieneś tego robić '' OK, przyjdź i napisz dla mnie mój kod ... będziesz musiał zrób to ...)
FastAl

8

Tylko uwaga, jest nowy sposób na zrobienie tego w C # 8.0: operatory zakresu

Dokumenty Microsoft

Lub, jak lubię je nazywać, plastry pandy.

Stara droga:

string newString = oldstring.Substring(0, 5);

Nowy sposób:

string newString = oldstring[..5];

Co na pierwszy rzut oka wydaje się być dość złym kompromisem w postaci pewnej czytelności dla krótszego kodu, ale nowa funkcja daje

  1. standardowa składnia do wycinania tablic (a więc łańcuchów)
  2. fajne rzeczy takie jak to:

    var slice1 = lista [2 .. ^ 3]; // lista [Range.Create (2, Index.CreateFromEnd (3))]

    var slice2 = lista [.. ^ 3]; // lista [Range.ToEnd (Index.CreateFromEnd (3))]

    var slice3 = lista [2 ..]; // lista [Range.FromStart (2)]

    var slice4 = lista [..]; // lista [Range.All]


7
string str = "GoodMorning"

string strModified = str.Substring(0,5);

2
wystąpi błąd, jeśli długość zmiennej „str” jest mniejsza niż 5
Moji,

3

Aby uzyskać pierwszą liczbę n znaków z ciągu w C #

String yourstring="Some Text";  
String first_n_Number_of_Characters=yourstring.Substring(0,n);

2

Poniżej znajduje się metoda rozszerzenia, która sprawdza, czy ciąg jest większy niż potrzebny, i skraca ciąg do zdefiniowanej maksymalnej liczby znaków i dodaje „...”.

public static class StringExtensions
{
    public static string Ellipsis(this string s, int charsToDisplay)
    {
        if (!string.IsNullOrWhiteSpace(s))
            return s.Length <= charsToDisplay ? s : new string(s.Take(charsToDisplay).ToArray()) + "...";
        return String.Empty;
    }
}


1

Używam:

var firstFive = stringValue?.Substring(0, stringValue.Length >= 5 ? 5 : customAlias.Length);

lub alternatywa, jeśli chcesz również sprawdzić odstępy (zamiast tylko Null):

var firstFive = !String.IsNullOrWhiteSpace(stringValue) && stringValue.Length >= 5 ? stringValue.Substring(0, 5) : stringValue

1

Lub możesz użyć String.ToCharArray () .
Pobiera int startindexi int lengthjako parametry i zwraca plikchar[]

new string(stringValue.ToCharArray(0,5))

Nadal musisz upewnić się, że ciąg ma odpowiednią długość, w przeciwnym razie wyrzuci ArgumentOutOfRangeException


1

Prosimy spróbować tego kodu, gdy str jest mniejsze niż 5.

string strModified = str.Substring(0,str.Length>5?5:str.Length);

1

Tak to robisz w 2020 roku:

var s = "ABCDEFGH";
var first5 = s.AsSpan(0, 5);

Span <T> punkty bezpośrednio do pamięci łańcucha, unikając przydzielania tymczasowy łańcuch. Oczywiście każda kolejna metoda stringwymagająca konwersji wymaga konwersji:

Console.WriteLine(first5.ToString());

Chociaż obecnie wiele .NETinterfejsów API zezwala na rozpiętości. Trzymaj się ich, jeśli to możliwe!

Uwaga: w przypadku kierowania .NET Frameworkdodaj odwołanie do pakietu System.Memory , ale nie oczekuj takiej samej doskonałej wydajności.


Naprawdę musimy zobaczyć wersję .net przed użyciemAsSpan
Zaheer

„W 2020 r.” Prawie sugeruje, że celujesz .NET 5lub przynajmniej .NET Core. W każdym razie działa, .NET Framework 4.5+jeśli dodasz pewne zależności.
l33t

0

Jeśli chcemy tylko pierwszych 5 znaków z dowolnego pola, można to osiągnąć za pomocą Left Attribute

Vessel = f.Vessel !=null ? f.Vessel.Left(5) : ""


-3

Wypróbowałem powyższe odpowiedzi i myślę, że najlepsza jest ta

@item.First_Name.Substring(0,1)

W tym mogłem uzyskać pierwszą literę ciągu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.