2010-05-26 5 views
31

Es ist wahrscheinlich albern etwas, was ich verpasst, aber ich versuche, eine Liste von ganzen Zahlen zu verketten, anstatt sie Summieren mit:LINQ: Wie verkette ich eine Liste von Ganzzahlen in Kommatrennzeichen?

integerArray.Aggregate((accumulator, piece) => accumulator+"," + piece) 

Der Compiler beschwerte sich über Argument Fehler. Gibt es einen glatten Weg, dies zu tun, ohne durch eine Schleife gehen zu müssen?

Antwort

54

Welche Version von .NET? In 4.0 können Sie string.Join(",",integerArray) verwenden. In 3.5 wäre ich versucht, einfach string.Join(",",Array.ConvertAll(integerArray,i=>i.ToString())); zu verwenden (vorausgesetzt, es ist ist ein Array). Ansonsten, entweder machen es ein Array, oder verwenden Sie StringBuilder.

+0

Wäre es nicht immer am besten, einen StringBuilder in diesem Fall zu verwenden? –

+4

Seltsamerweise ist der Join leistungsfähiger als der StringBuilder. Ich habe einen Test gemacht, und mit einem Array von 1.000.000, nahm Join 207ms, während StringBuilder 264ms dauerte. Ich vermute, das liegt daran, dass der Join für die Aufgabe optimiert ist, während der SB eher für den allgemeinen Fall optimiert ist. – Cyberherbalist

+0

Wenn ich nicht einen 'Array'-Typ hatte, gibt es einen Geschwindigkeitsunterschied zwischen' Array.ConvertAll (list.ToArray(), ...) 'gegenüber' IEnumerable.Select (...). ToArray() '? – Michael

14

Der Fehler, den Sie erhalten, liegt darin, dass Sie nicht die Überschreibung von Aggregate verwendet haben, mit der Sie den Seed angeben können. Wenn Sie den Seed nicht angeben, wird der Typ der Auflistung verwendet.

integerArray.Aggregate("", (accumulator, piece) => accumulator + "," + piece); 
+1

+1, weil Sie die Frage beantwortet haben. Ihr Code hat jedoch eine O (n^2) -Leistung. Nicht cool. –

+0

zählen Sie jetzt die Anzahl der beteiligten Strings ... –

+1

@KennetBelenky, 'Aggregate' ist nichts anderes als eine foreach-Schleife, die den Wert einer Variablen festlegt. - Das ist O (n) nicht O (n^2)? – ebb

2

Nur eine weitere Alternative zu @ Marc

var list = string.Join(",", integerArray.Select(i => i.ToString()).ToArray()); 
11

Sie wahrscheinlich verwenden String.Join hinzufügen möchten.

string.Join(",", integerArray.Select(i => i.ToString()).ToArray()); 

Wenn Sie .Net 4.0 verwenden, müssen Sie nicht die Mühe machen, ein Array zu reparieren. und kann einfach tun

string.Join(",", integerArray); 
+0

Slick! Wirklich hilfreich. – Cyberherbalist

Verwandte Themen