Jak utworzyć ciąg rozdzielany przecinkami na podstawie ArrayList?


84

Przechowuję ArrayList of Ids w skrypcie przetwarzania, który chcę wypluć jako listę rozdzielaną przecinkami na wyjście do dziennika debugowania. Czy jest sposób, w jaki mogę to łatwo uzyskać bez przeglądania rzeczy?

EDYCJA: Dziękuję Joelowi za wskazanie listy (Of T), która jest dostępna w .net 2.0 i nowszych. To sprawia, że ​​rzeczy są TONY łatwiejsze, jeśli masz to dostępne.


Zakładam, że ponieważ używasz ArrayList, używasz .Net 1.0 czy .Net 1.1?
kͩeͣmͮpͥ ͩ

Odpowiedzi:


160

Tak, odpowiadam na własne pytanie, ale jeszcze go tu nie znalazłem i pomyślałem, że to dość zręczna rzecz:

... w VB.NET:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String()))

... w C #

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String")))

Jedynym problemem jest to, że ArrayList musi mieć elementy przechowywane jako ciągi znaków, jeśli używasz Option Strict, aby upewnić się, że konwersja przebiega prawidłowo.

EDYCJA: Jeśli używasz .net 2.0 lub nowszego, po prostu utwórz obiekt typu List (Of String) i możesz uzyskać to, czego potrzebujesz. Wielkie dzięki dla Joela za poruszenie tego tematu!

String.Join(",", TargetList.ToArray())

2
Istnieją inne „pułapki”. Jednym z nich jest to, że to rozwiązanie nie jest tak idiomatyczne, jak samodzielne przeglądanie listy. Po drugie, jeśli ToArray przechodzi przez kolekcję, a Join również, zajmuje to dwa razy dłużej niż prosta pętla foreach.
Bill the Lizard

Oczywiście zawsze istnieje możliwość korzystania z System.Collections.Specialized.StringCollection.
ICR

Jeśli zamiast tego możesz rozważyć użycie List <string>, który ma wbudowaną metodę ToArray () i eliminuje problemy z typami. BTW - typeof (string) jest preferowany niż Type.GetType ("System.String").
Jon B

17

Dotychczasowe rozwiązania są dość skomplikowane. Idiomatycznym rozwiązaniem powinno być niewątpliwie:

String.Join(",", x.Cast(Of String)().ToArray())

W nowych wersjach frameworka nie ma potrzeby wykonywania wymyślnych akrobacji. Zakładając niezbyt nowoczesną wersję, najłatwiej byłoby:

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String())))

Drugie rozwiązanie mspmsp również jest miłym podejściem, ale nie działa, ponieważ pomija AddressOfsłowo kluczowe. Ponadto Convert.ToStringjest raczej nieefektywny (wiele niepotrzebnych wewnętrznych ocen), a Convertklasa generalnie nie jest zbyt przejrzyście zaprojektowana. Staram się tego unikać, zwłaszcza, że ​​jest to całkowicie zbędne.


Czy CType i CStr nie są w zasadzie wywołaniami klasy Convert?
Joel Coehoorn

@Echostorm: gdzie mam to powiedzieć? @Joel: wcale. W większości przypadków wywołują funkcję MS.VB.CS.Conversions.ToStringpomocniczą, co skutkuje prostym ToStringwywołaniem. Ale nawet tej metody nie nazwałbym bezpośrednim y (w przeciwieństwie do operatorów rzutowania VB).
Konrad Rudolph

16

Coś jak:

String.Join(",", myArrayList.toArray(string.GetType()) );

Co w zasadzie zapętla, wiesz ...

EDYTOWAĆ

Co powiesz na:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));

ups ... to nie w porządku ... a co powiesz na: string.Join (",", Array.ConvertAll <object, string> (a.ToArray (), Convert.ToString));
mspmsp

8

string.Join(" ,", myArrayList.ToArray()); To zadziała z .NET Framework 4.5


2

Oto prosty przykład demonstrujący tworzenie ciągu rozdzielanego przecinkami za pomocą String.Join () z listy ciągów:

List<string> histList = new List<string>();
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff"));
histList.Add(Index.ToString());
/*arValue is array of Singles */
foreach (Single s in arValue)
{
     histList.Add(s.ToString());
}
String HistLine = String.Join(",", histList.ToArray());

2
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

lub

string.Concat(foo.ToArray().Select(a => a += ",").ToArray())

Aktualizacja, ponieważ jest bardzo stara. Powinieneś oczywiście użyć string. Dołącz teraz. Nie istniała jako opcja w momencie pisania.


Wow, naprawdę przepraszam! Całkowicie przeoczyłem znacznik „C #” w pytaniu i przypuszczałem, że Twoje odpowiedzi miały być poprawnym kodem VB. Wstyd mi. Ale skoro już czepiamy się dziury: twoja druga odpowiedź dodaje na końcu dodatkowe „”.
Konrad Rudolph
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.