2010-08-20 20 views
12

Próbuję następującyJak przyciąć wszystkie elementy na liście?

string tl = " aaa, bbb, ccc, dddd    eeeee"; 

var tags = new List<string>(); 
tags.AddRange(tl.Split(',')); 
tags.ForEach(x => x = x.Trim().TrimStart().TrimEnd()); 

var result = String.Join(",", tags.ToArray()); 

Ale to nie działa, znaczniki zawsze wrócić jak „aaa”, „BBB”.

Jak przyciąć wszystkie elementy na liście?

Odpowiedz

24
// you can omit the final ToArray call if you're using .NET 4 
var result = string.Join(",", tl.Split(',').Select(s => s.Trim()).ToArray()); 

Jeśli potrzebujesz tylko końcowy ciąg wyników, a nie kolekcję pośrednią, możesz użyć wyrażenia regularnego do uporządkowania łańcucha. Musisz odniesienia w celu ustalenia, czy regex przewyższa split-TRIM-przyłączyć techniki:

var result = Regex.Replace(tl, @"(?<=^|,) +| +(?=,|$)", ""); 
+0

To nie zadziała tak, jak chce. Problem polega na tym, że nie ma przecinka między dddd i eeeee. –

+5

@Justin: Gdzie PO mówi, że to jest problem? O ile mogę powiedzieć, powinny być cztery elementy na liście: * "aaa" *, * "bbb" *, * "ccc" * i * "dddd eeeee" *. – LukeH

+0

Jakoś się domyśliłem. I masz rację. Za dużo czytałem i założyłem. –

1

Twoim problemem jest to, że nie ma przecinka pomiędzy dddd i eeeee. Jeśli chcesz, aby były oddzielne, musisz podzielić na ' ', usunąć przecinki, a następnie przyciąć dodatkowe białe znaki.

string tl = " aaa, bbb, ccc, dddd    eeeee"; 

var result = t1.Split(' ').Where(s => !String.IsNullOrEmpty()) 
          .Select(s => s.Replace(',','').Trim()) 
          .ToArray(); 
+0

Pamiętaj tylko, aby odfiltrować wszystkie puste elementy po podzieleniu przez spację: tl.Split (''). Wybierz (s => s.Replace (",", "") Trim()). =>! string.IsNullOrEmpty (s)). ToArray() – theburningmonk

5

Powodem Twoje podejście nie działa jest to, że x jest kopią aktualnego odniesienia ciąg przetwarzane w zaproszeniu ForEach (tj lokalny delegatowi). W związku z tym przypisanie nie ma wpływu na element wymieniony na liście.

4

Chodzi o to, że próbujesz zmodyfikować kolekcję za pomocą instrukcji foreach - co nie jest możliwe. Kolekcje nie mogą być modyfikowane za pomocą foreach.

Będziesz musiał zmodyfikować pętlę for, lub używając lambdas, możesz użyć rozwiązania LukeH.

Powiązane problemy