Usuń ostatni znak łańcucha

Pobieram wiele informacji na liście, połączonej z bazą danych i chcę utworzyć ciąg grup, dla kogoś, kto jest podłączony do strony internetowej.

Używam tego do testowania, ale to nie jest dynamiczne, więc jest naprawdę źle:

string strgroupids = "6";
Chcę tego użyć teraz. Ale zwracany łańcuch jest czymś w rodzaju 1,2,3,4,5,
groupIds.ForEach((g) =>
{
    strgroupids = strgroupids  + g.ToString() + ",";
    strgroupids.TrimEnd(',');
});

strgroupids.TrimEnd(new char[] { ',' });

Chcę usunąć , Po 5, ale na pewno nie działa.

 286
Author: Trilarion, 2011-10-26

11 answers

strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

Sznurek.Remove (Int32):

Usuwa wszystkie znaki z tego ciągu rozpoczynającego się od określonego pozycja i kontynuacja przez ostatnią pozycję

 657
Author: sll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:22:50

A co z robieniem tego w ten sposób

strgroupids = string.Join( ",", groupIds );

Alot cleaner.

Doda wszystkie elementy wewnątrz groupIds z ',' pomiędzy każdym, ale nie umieści ',' na końcu.

 98
Author: Øyvind Bråthen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:23:31

Ciągi w c# są niezmienne. Gdy w Twoim kodzie robisz strgroupids.TrimEnd(','); LUB strgroupids.TrimEnd(new char[] { ',' }); strgroupids ciąg nie jest modyfikowany .

Zamiast tego musisz zrobić coś takiego jak strgroupids = strgroupids.TrimEnd(',');.

Cytuję z tutaj :

Łańcuchy są niezmienne--zawartość obiektu string nie może być zmieniany po wytworzeniu obiektu, choć składnia czyni go wygląda na to, że możesz to zrobić. Na przykład, kiedy piszesz ten kod, kompilator faktycznie tworzy nowy obiekt string do hold the new sekwencji znaków, a ten nowy obiekt jest przypisany do b. W ciąg " h " kwalifikuje się wtedy do usuwania śmieci.

 31
Author: Andy Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:29:13

Dodaj metodę rozszerzenia.

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

Następnie użyj:

yourString.RemoveLast(",");
 11
Author: nznoor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 20:24:26

Usuwa przecinki końcowe:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

To jest jednak odwrotnie, napisałeś kod, który dodaje przecinek na pierwszym miejscu. Zamiast tego należy użyć string.Join(",",g), zakładając, że g jest string[]. Nadaj jej też lepszą nazwę niż g!

 8
Author: Kieren Johnstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:22:25

W C# 8 wprowadzono zakresy i indeksy , dając nam nowe, bardziej zwięzłe rozwiązanie:

strgroupids = strgroupids[..^1];
 5
Author: Dodgyrabbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-26 21:06:42

Jako alternatywę do dodawania przecinka dla każdego elementu można po prostu użyć String.Join:

var strgroupids = String.Join(",",  groupIds);

Spowoduje dodanie separatora ("," w tym przypadku) pomiędzy każdym elementem tablicy.

 4
Author: Gary.S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:24:59
string strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    strgroupids = strgroupids + g.ToString() + ",";
});

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Zauważ, że użycie ForEach tutaj jest zwykle uważane za " złe " (czytaj na przykład http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Używając LINQ:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

Bez podciągu końcowego:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));
 3
Author: xanatos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 10:29:39

Dodatkowe rozwiązanie sll: lepiej przyciąć łańcuch w przypadku, gdy są jakieś puste (s) na końcu.

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);
 3
Author: tanzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 17:04:40

string.Join jest lepsze, ale jeśli naprawdę chcesz LINQ ForEach:

var strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    if(strgroupids != string.Empty){
        strgroupids += ",";
    }

    strgroupids += g;
});

Kilka uwag:

  • string.Join i foreach są lepsze od tego, znacznie wolniejsze, podejście
  • nie ma potrzeby usuwania ostatniego ,, ponieważ nigdy nie jest dołączany
  • operator increment (+=) jest przydatny do dodawania do łańcuchów
  • .ToString() jest niepotrzebny, ponieważ jest wywoływany automatycznie podczas łączenia nie-ciągów
  • podczas obsługi dużych łańcuchów, StringBuilder powinny być rozważane zamiast konkatenacji strun
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 18:50:48

Nie ma na to żadnego "szybkiego i brudnego" sposobu. Zwykle tak:

mystring= string.Concat(mystring.Take(mystring.Length-1));
 0
Author: Zuabros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-16 15:10:37