2012-10-03 8 views
6

Questa domanda è solo per scopi accademici.Partecipa a una stringa [] Senza utilizzare string.Join

Supponiamo che io ho il seguente codice ...

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()); 

E vorrei che la linea con la freccia per produrre lo stesso risultato di questa ...

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

... senza usare string.Join.

È possibile? Non riesco a trovare una dichiarazione LINQ per farlo ... speriamo che lo sappiate già!

+2

risposte interessanti, ma io sono curioso, perché stai cercando un approccio diverso di string.Join? E inoltre, tu dici che stai cercando una dichiarazione di Linq, ma la tua risposta accettata (in effetti una buona) non sta usando affatto Linq :) – Wasp

+0

@Wasp, ancora una volta la domanda era accademica. Inoltre, intendevo __not__ per dire che avevo richiesto che fosse risolto tramite LINQ, ma più che stavo cercando una dichiarazione LINQ per farlo perché ___thought___ era l'approccio migliore. Tuttavia, alla fine, Guffa mi ha mostrato un modo più perfetto. –

+1

Quindi la domanda _should_ è stata: come posso ignorare l'ultimo segmento di questa stringa e rimuovere le virgole. Sei stato fortunato e hai ottenuto la risposta che hai __edito_, ma non la risposta che hai chiesto_. –

risposta

4

Non utilizzare Split neanche, basta individuare l'ultima virgola e utilizzare Substring di dividere la stringa:

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

Risposta molto buona e l'approccio migliore nel complesso. Ho intenzione di modificare la tua risposta con la mia soluzione generale perché è spuntato un nuovo requisito e voglio che le persone lo vedano (il campo 'name' può contenere virgole anche se stanno inviando il file tramite CSV, forse avrebbe dovuto usare un delimitatore migliore eh?) –

+0

@Mike: Giusto, stavi unendo le stringhe senza virgole. Puoi semplicemente rimuoverli dalla prima stringa con un 'Sostituisci'. – Guffa

+0

Ho sbagliato! Non ho dovuto modificarlo perché ci sono solo due valori e hai eseguito la sottostringa alla posizione LAST ogni volta. Molto, molto, ottima soluzione ed è estremamente efficiente! –

2

come circa

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

o l'equivalente non linq:

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

Questo è corretto, ma la prestazione è quadratica. –

+0

Terribilmente lento ... – SimpleVar

+1

+1 ... @YoryeNathan, questa è una soluzione totalmente accettabile. Runtime quadratico, vero, ma per il probabile caso d'uso questo potrebbe ancora essere * più veloce * della soluzione usando 'StringBuilder': guardando il codice OP questo è usato per impostare un valore di attributo XML chiamato' name' - per quanto tempo si aspetta che la collezione sia? –

6

Utilizzando una StringBuilder per O (n) prestazioni:

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

Se l'oggetto è quello di evitare l'imbarazzo di un albero di chiamate LINQ combinate e metodi statici, quindi una soluzione semplice è un exte Metodo nsion:

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

E poi:

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

Trovo questo per leggere molto meglio che usare string.Join nelle espressioni complicate.

+0

+1 per una buona soluzione –

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

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

Basta rimuovere l'ultimo "," dalla fine.

+0

Dare una dimensione a "StringBuilder" comporta un aumento della velocità, ma non una velocità asintotica. Questo può essere inferiore al sovraccarico dal 'Sum'. –

+0

Merita un controllo .. – 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)); 
Problemi correlati