Jaki jest najczystszy sposób utworzenia rozdzielonej przecinkami listy wartości ciągów z IList<string>
lub lub IEnumerable<string>
?
String.Join(...)
działa na string[]
tak, więc może być uciążliwy w pracy, gdy typy takie jak IList<string>
lub IEnumerable<string>
nie mogą być łatwo przekonwertowane na tablicę ciągów.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Odpowiedzi:
.NET 4+
Szczegóły i rozwiązania .Net 4.0
IEnumerable<string>
można bardzo łatwo przekonwertować na tablicę ciągów za pomocą LINQ (.NET 3.5):Wystarczy napisać równoważną metodę pomocnika, jeśli potrzebujesz:
Następnie nazwij to tak:
Możesz wtedy zadzwonić
string.Join
. Oczywiście nie musisz używać metody pomocniczej:Ten ostatni jest jednak trochę kęs :)
Jest to prawdopodobnie najprostszy sposób, aby to zrobić, a także dość wydajny - istnieją inne pytania dotyczące dokładnie tego, jak wygląda wydajność, w tym (ale nie wyłącznie) ten .
Począwszy od .NET 4.0, dostępnych jest więcej przeciążeń w
string.Join
, więc możesz po prostu napisać:O wiele prostsze :)
źródło
List<T>
robi. Po co wymyślać koło ponownie?ToList
. Można gostring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
jednak używać .Do Twojej wiadomości, wersja .NET 4.0
string.Join()
ma pewne dodatkowe przeciążenia , które działająIEnumerable
zamiast tylko tablic, w tym takie, które mogą poradzić sobie z dowolnym rodzajemT
:źródło
str = emps.Select(e => e.SSN).Join(",")
Najłatwiejszy sposób to zrobić, używając
Aggregate
metody LINQ :źródło
Func<StringBuilder,string,StringBuider>
. Następnie po prostu wywołajToString()
zwrócony StringBuilder. Oczywiście nie jest tak ładna :)input.Count
powinno być więcej niż 1.Myślę, że najczystszym sposobem utworzenia listy wartości łańcuchowych oddzielonych przecinkami jest po prostu:
Oto pełny przykład:
Nie ma potrzeby wykonywania funkcji pomocniczej, jest ona wbudowana w .NET 4.0 i nowsze wersje.
źródło
Porównując wydajność, zwycięzcą jest „Zapętlić, sb. Dołącz go i cofnij się”. W rzeczywistości „ruchome, wyliczalne i ręczne przejście dalej” jest tym samym dobrem (rozważ stddev).
Kod:
Wykorzystano https://github.com/dotnet/BenchmarkDotNet
źródło
Ponieważ doszedłem tutaj, szukając dołączyć do określonej właściwości listy obiektów (a nie jej ToString ()), oto dodatek do zaakceptowanej odpowiedzi:
źródło
Oto kolejna metoda rozszerzenia:
źródło
Przybyłem trochę za późno na tę dyskusję, ale to mój wkład fwiw. Mam
IList<Guid> OrderIds
do przekonwertowania na ciąg CSV, ale poniższy jest ogólny i działa niezmodyfikowany z innymi typami:Krótki i słodki, używa StringBuilder do konstruowania nowego ciągu, zmniejsza długość StringBuilder o jeden, aby usunąć ostatni przecinek i zwraca ciąg CSV.
Zaktualizowałem to, aby użyć wielu
Append()
, aby dodać ciąg + przecinek. Na podstawie opinii Jamesa użyłem Reflectora, żeby się przyjrzećStringBuilder.AppendFormat()
. Okazuje się, żeAppendFormat()
używa StringBuilder do skonstruowania ciągu formatu, co czyni go mniej wydajnym w tym kontekście niż tylko używanie wieluAppends()
.źródło
Coś trochę nieprzyzwoicie, ale działa:
Daje plik CSV z listy po przekazaniu mu konwertera (w tym przypadku d => d.DivisionID.ToString („b”)).
Hacky, ale działa - czy można go przekształcić w metodę rozszerzenia?
źródło
Oto jak to zrobiłem, korzystając ze sposobu, w jaki to zrobiłem w innych językach:
źródło
Szczególna potrzeba, kiedy powinniśmy otaczać „, np .:
źródło
Mamy funkcję narzędzia, coś takiego:
Które można wykorzystać do łatwego łączenia wielu kolekcji:
Zauważ, że mamy parametr kolekcji przed lambda, ponieważ intellisense następnie wybiera typ kolekcji.
Jeśli masz już wyliczenie ciągów, wszystko, co musisz zrobić, to ToArray:
źródło
można przekonwertować IList na tablicę za pomocą ToArray, a następnie uruchomić komendę string.join na tablicy.
źródło
Można je łatwo przekonwertować na tablicę za pomocą rozszerzeń Linq w .NET 3.5.
źródło
Możesz również użyć czegoś takiego jak następujące po przekonwertowaniu go na tablicę przy użyciu jednej z metod wymienionych przez innych:
Edycja: Oto inny przykład
źródło
Właśnie rozwiązałem ten problem, zanim przejrzałem ten artykuł. Moje rozwiązanie wygląda mniej więcej tak:
Nazywany jak:
Mógłbym równie łatwo wyrazić jako taki i byłbym również bardziej wydajny:
źródło
Moja odpowiedź jest jak powyższe rozwiązanie agregujące, ale powinno być mniej obciążające stos wywołań, ponieważ nie ma wyraźnych wywołań delegowania:
Oczywiście można rozszerzyć podpis, aby był niezależny od separatora. Naprawdę nie jestem fanem wywołania sb.Remove () i chciałbym przekształcić go w pętlę while over-up nad IEnumerable i użyć MoveNext (), aby ustalić, czy napisać przecinek. Będę majstrować i publikować to rozwiązanie, jeśli na niego wpadnę.
Oto, czego początkowo chciałem:
Nie jest wymagane tymczasowe przechowywanie tablic lub list,
StringBuilder
Remove()
aniLength--
hack.W mojej bibliotece frameworków dokonałem kilku zmian w sygnaturze tej metody, każda kombinacja włączenia
delimiter
iconverter
parametrów odpowiednio z użyciem","
ix.ToString()
jako domyślnych.źródło
Mam nadzieję, że jest to najprostszy sposób
źródło
Przeszedłem tę dyskusję, szukając dobrej metody C # do łączenia ciągów, tak jak w przypadku metody MySql
CONCAT_WS()
. Ta metoda różni się odstring.Join()
metody tym, że nie dodaje znaku separatora, jeśli łańcuchy są NULL lub puste.zwróci tylko
Lastname
wtedy, gdy imię jest puste, natomiastwróci
strLastname + ", "
w tym samym przypadku.Chcąc pierwszego zachowania, napisałem następujące metody:
źródło
Napisałem kilka metod rozszerzenia, aby zrobić to w sposób, który jest wydajny:
To zależy od
źródło
Można używać
.ToArray()
naLists
iIEnumerables
, a następnie użyjString.Join()
jak chciałeś.źródło
Jeśli ciągi, które chcesz połączyć, znajdują się na liście obiektów, możesz również zrobić coś takiego:
źródło