2012-10-03 13 views
6

Diese Frage ist nur für akademische Zwecke.Verknüpfen einer Zeichenfolge [] Ohne Verwendung von string.Join

Nehmen wir an, ich den folgenden Code haben ...

var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", split.Take(split.Length - 1)); <===== 
elem.SetAttributeValue("tin", split.Last()); 

Und ich würde die Linie mit dem Pfeil mögen das gleiche Ergebnis wie dieses ...

string.Join(string.Empty, split.Take(split.Length - 1)); 

zu produzieren ... ohne Verwendung von string.Join.

Ist das möglich? Ich kann anscheinend keine LINQ-Anweisung finden, um das zu tun ... hoffentlich weißt du es schon!

+2

Interessante Antworten, aber ich bin neugierig, warum suchen Sie nach einem anderen Ansatz als string.Join? Und auch, Sie sagen, dass Sie nach einer Linq-Aussage suchen, aber dann akzeptiert Ihre akzeptierte Antwort (eine gute in der Tat) Linq überhaupt nicht :) – Wasp

+0

@Wasp, wieder war die Frage akademisch. Weiter meinte ich, ich wollte nicht sagen, dass ich es über LINQ lösen wollte, sondern eher, dass ich nach einer LINQ-Anweisung gesucht habe, um es zu tun, weil ich dachte, dass das der beste Ansatz wäre. Am Ende zeigte mir Guffa einen perfekteren Weg. –

+1

Die Frage _should_ war also - wie kann ich das letzte Segment dieser Zeichenfolge ignorieren und die Kommas entfernen. Du hattest Glück und hast die Antwort bekommen, die du brauchst, aber nicht die Antwort, die du für _ verlangst. –

Antwort

4

Sie Split auch nicht verwenden, nur das letzte Komma lokalisieren und Substring verwenden, um die Zeichenfolge zu teilen:

int pos = line.LastIndexOf(','); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty)); 
elem.SetAttributeValue("tin", line.Substring(pos + 1)); 
+0

Sehr gute Antwort und der beste Ansatz insgesamt. Ich werde Ihre Antwort mit meiner Gesamtlösung bearbeiten, da eine neue Anforderung auftrat und ich möchte, dass die Leute sie sehen (das Feld 'name' kann Kommas enthalten, obwohl sie die Datei per CSV senden, hätte es vielleicht verwenden sollen) ein besseres Trennzeichen huh?) –

+0

@Mike: Richtig, Sie waren die Zeichenfolgen ohne Kommas verbunden. Sie können sie einfach mit einem 'Ersetzen' aus der ersten Zeichenfolge entfernen. – Guffa

+0

Ich habe mich geirrt! Ich musste es nicht ändern, weil es nur zwei Werte gibt, und Sie haben die Teilzeichenfolge jedes Mal auf die LETZTE Position gesetzt. Sehr, sehr, sehr gute Lösung und es ist auch sehr effizient! –

2

wie etwa

split.Take(split.Length - 1).Aggregate((s1,s2)=> s1 + s2); 

oder der nicht-linq äquivalent:

string s = ""; 
for(int i = 0; i < split.Length - 1; i++) 
{ 
    s += split[i]; 
} 
return s; 
+0

Das ist richtig, aber die Leistung ist quadratisch. –

+0

Schrecklich langsam ... – SimpleVar

+1

+1 ... @YoryeNathan, das ist eine völlig akzeptable Lösung. Quadratische Laufzeit, richtig, aber für den wahrscheinlichsten Anwendungsfall könnte dies immer noch * schneller * sein als die Lösung mit dem 'StringBuilder': Betrachtet man OPs Code, wird dieser verwendet, um einen XML-Attributwert namens' name' zu ​​setzen erwarte die Sammlung zu sein? –

6

eine StringBuilder für O (n) Leistungs Verwendung:

split 
    .Take(split.Length - 1) 
    .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString(); 

Wenn das Objekt zu vermeiden ist, die Ungeschicklichkeit eines Baumes von kombinierten LINQ-Aufrufen und statischen Methoden, dann ist eine einfache Lösung ein exte nsion Methode:

public static string Join(this IEnumerable<string> self, string separator = "") 
{ 
    return string.Join(separator, self); 
} 

Und dann:

split.Take(split.Length - 1).Join(); 

ich das finden viel besser lesen als string.Join in komplizierten Ausdrücken.

+0

+1 für eine gute Lösung –

0
var strs = new string[100]; 
... 

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)), 
          (sb, curr) => sb.Append(s + ", ")).ToString(); 

Müssen nur die letzten "," vom Ende jetzt entfernen.

+0

Wenn Sie dem 'StringBuilder' eine Größe geben, erhalten Sie eine Beschleunigung, aber keine asymptotische Beschleunigung. Dies kann weniger als der Overhead von der Summe sein. –

+0

einen Scheck wert .. – SimpleVar

0
string myString = "Hello World" 
var myList= new List<int>(); 

for (int i = 0; i < 10; i++) 
    myList.Add(i); 

var newList = myList.Aggregate(string.Empty, (current, num) => current + myString.Substring(num, 1)); 
Verwandte Themen