Pobieram wiele informacji z listy 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 nie jest to dynamiczne, więc jest naprawdę złe:
string strgroupids = "6";
Chcę tego teraz użyć. Ale zwrócony ciąg znaków jest podobny1,2,3,4,5,
groupIds.ForEach((g) =>
{
strgroupids = strgroupids + g.ToString() + ",";
strgroupids.TrimEnd(',');
});
strgroupids.TrimEnd(new char[] { ',' });
Chcę usunąć ,
po, 5
ale zdecydowanie nie działa.
strgroupids = strgroupids.TrimEnd(new char[] { ',' });
ale poniżej są lepsze pomysły.Odpowiedzi:
MSDN:
źródło
Co powiesz na robienie tego w ten sposób?
Wiele czystsze.
Będzie dołączyć wszystkie elementy wewnątrz
groupIds
z','
pomiędzy siebie, ale to nie będzie umieścić','
na końcu.źródło
Ciągi w c # są niezmienne. Kiedy w kodzie zrobić
strgroupids.TrimEnd(',');
lub ciąg nie jest modyfikowany .strgroupids.TrimEnd(new char[] { ',' });
strgroupids
Zamiast tego musisz zrobić coś takiego
strgroupids = strgroupids.TrimEnd(',');
.Aby cytować stąd :
źródło
Dodaj metodę rozszerzenia.
następnie użyj:
źródło
int n
liczbę znaków do usunięcia na końcu. Po drugie, testujesz zerową długość, ale to nie eliminuje wszystkich możliwych wyjątków. Lepiej byłoby zrobićint index = ..LastIndexOf..
, toif (index >= 0)
.string character
jest źle nazwany. Po czwarte, nie jest od razu oczywiste dla przyszłych programistów, że usuwa znaki na końcu łańcucha. Och, czekaj, to niekoniecznie tak robi. Przeszukuje ciąg. Może to być usunięcie gdzieś pośrodku. Teraz programista konserwacji musi zbadać wszystkie zastosowania metody, aby zobaczyć, co próbowano osiągnąć. Nie jest to dobra metoda wywoływania, ponieważ ta prosta potrzeba usunięcia z końca łańcucha. Przepraszam za całą krytykę; Robię to dla każdego, kto przyjmuje tę metodę, więc rozumieją.String.TrimEnd
byłoby bardziej odpowiednie zastosowanie. Ale czekaj, to już istnieje - i zostało wspomniane w pierwotnym pytaniu i kilku innych odpowiedziach 3 lata temu - nie trzeba wymyślać nowej metody! Jakie są zalety twojego podejścia?Usuwa wszystkie przecinki końcowe:
Jest to jednak odwrotnie, napisałeś kod, który dodaje przecinek w pierwszej kolejności. Powinieneś użyć
string.Join(",",g)
zamiast tego, zakładając, żeg
jeststring[]
. Nadaj mu lepszą nazwę niżg
też!źródło
Zamiast dodawania przecinka dla każdego elementu można po prostu użyć String.Join:
Spowoduje to dodanie separatora („,” w tym przypadku) między każdym elementem w tablicy.
źródło
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 )Korzystanie z LINQ:
Bez podciągów końcowych:
źródło
string.Join
jest idealny JEŻELI masz tablicę ciągów jako źródło LUB masz C # 4.0Dodatkowo do rozwiązania sll: Lepiej przyciąć łańcuch, jeśli na końcu są jakieś puste miejsca.
źródło
string.Join
jest lepszy, ale jeśli naprawdę chcesz LINQForEach
:Niektóre uwagi:
string.Join
iforeach
oba są lepsze niż to, znacznie wolniejsze podejście,
ponieważ nigdy nie jest dołączany+=
) jest przydatny do dołączania do łańcuchów.ToString()
jest niepotrzebne, ponieważ jest wywoływane automatycznie podczas łączenia łańcuchów innych niż łańcuchyStringBuilder
należy rozważyć zamiast łączenia ciągówźródło
if(strgroupids != string.Empty){
ForEach
;foreach (var g in groupIds) {
działa równie dobrze :)