2011-10-18 13 views
7

ho una stringa comeAdd interruzione di riga dopo 3 virgole

"tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33" 

voglio aggiungere un'interruzione di riga dopo 3 virgole ogni

"tom: 1, john: 3, timmy: 5, </br> cid: 8, ad: 88, hid: 99, </br> mn: 33" 
+2

Nessun lavoro a casa per favore, facci sapere cosa hai provato finora. – Zenwalker

risposta

4

Credo for ciclo sarebbe la soluzione più semplice e chiaro ma è interessante farlo usando LINQ:

string input = "tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
char delimiter = ','; 
var allParts = input.Split(delimiter); 
string result = allParts.Select((item, index) => (index != 0 && (index+1) % 3 == 0) 
        ? item + delimiter + " </br>" 
        : index != allParts.Count() - 1 ? item + delimiter : item) 
        .Aggregate((i, j) => i + j); 

// result (without a comma after the last item) 
// "tom: 1, john: 3, timmy: 5, </br> cid: 8, ad: 88, hid: 99, </br> mn: 33" 
+0

+1, per una singola riga di codice. –

0

dalla mia conoscenza di programmazione molto limitata e, vorrei usare un int per contare quanti nomi sono stati scritti. (int nameCount = 0). Ogni volta che scrivevo un nome aumentavo il contatore se fosse inferiore a 3 altrimenti avrei posto un'interruzione di riga.

0
string [] parts = yourString.Split(','); 
StringBuilder result = new StringBuilder(); 

for(int i = 0; i < parts.Length; i++) 
{ 
    result.Append(parts[i]); 
    if(i % 3 == 0) 
    { 
    result.Append("<br />"); 
    } 
} 
+2

il tuo codice non darà l'output che vuole, controlla una volta. –

+0

Il set di risultati finale dovrebbe contenere i simboli virgola ',' – sll

+0

Oops, dimenticato le virgole. @ La risposta di skk è migliore della mia. – Dmitriy

0

Prova questa ..

string[] split = textBox1.Text.Split(','); 
      int count =0; 
      for (int i = 0; i < split.Length; i++) 
      { 
       count+=1; 
       if (i < split.Length - 1) 
       { 
        textBox2.Text += split.GetValue(i) + ","; 
       } 
       else 
       { 
        textBox2.Text += split.GetValue(i); 
       } 
       if (count == 3) 
       { 
        count = 0; 
        textBox2.Text += " </br> "; 
       } 
      } 
2

utilizzare la seguente parte di codice, che funzionerà bene.

string input = "tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
      string[] parts = input.Split(','); 
      StringBuilder result = new StringBuilder(); 
      int i = 1; 
      while(i <= parts.Length) 
      { 
       result.Append(parts[i-1] + ","); 
       if (i % 3 == 0) 
       { 
        result.Append("<br />"); 
       } 
       i++; 
      } 

EDIT:

result = result.Remove(result.ToString().LastIndexOf(','), 1); 
    MessageBox.Show(result.ToString()); 
+1

L'ultimo elemento 'mn: 33' sarà seguito da una virgola', '? – sll

+0

Grazie @sll ora l'ho modificato. –

+0

Soluzione perfetta ... – SanamShaikh

1

Il meglio che posso fare con una soluzione LINQ:

var count = 0; 
    input.Aggregate(
     new StringBuilder(), 
     (sb, ch) => 
     { 
      sb.Append(ch); 
      if (ch == ',' && ++count % 3 == 0) sb.Append(" </br>"); 
      return sb; 
     }).ToString(); 
0

Questo vi darà l'output richiesto:

 string combinedValues = "tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
     string[] separatedValues = combinedValues.Split(','); 
     for (int i = 3; i < separatedValues.Count(); i = i + 3) 
     { 
      separatedValues[i] = @"<br />" + separatedValues[i]; 
     } 
     StringBuilder sb = new StringBuilder(); 
     foreach (string value in separatedValues) 
     { 
      sb.Append(value); 
      sb.Append(@","); 
     } 
     string combinedValuesWithBreak = sb.ToString(); 
+0

L'ultimo elemento 'mn: 33' sarà seguito dalla virgola', 'simbolo? – sll

1
string splitter = ", "; 
string newLine = "<br/>"; 
int splitAfter = 3; 
string s = "tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
string x = 
    s.Split(new[]{splitter}, StringSplitOptions.None) // Split 
    // Make each string entry into a Tuple containing the string itself 
    // and an integer key declaring into which group it falls 
    .Select((v, i) => 
     new Tuple<int, string>((int) Math.Floor((double) i/splitAfter), v)) 
    // Group by the key created in the line above 
    .GroupBy(kvp => kvp.Item1) 
    // Since the key is not needed any more select only the string value 
    .Select(g => g.Select(kvp => kvp.Item2) 
    // Join the groups 
    // (in your example each group is a collection of 3 elements) 
    .Aggregate((a, b) => a + splitter + b)) 
    // Join all the groups and add a new line in between 
    .Aggregate((a, b) => a + splitter + newLine + b); 

Lo sta facendo con "una riga" di LINQ. Anche se non sono sicuro che sia davvero desiderabile considerando che probabilmente è piuttosto difficile per un altro sviluppatore capire cosa sta succedendo qui a prima vista (specialmente se non hai molta esperienza con LINQ e soprattutto con la sua funzione GroupBy).

+0

Sembra che tu abbia un errore di battitura nella variabile 'spliterAfter' poiché usato nella query LINQ come' splitAfter', anche io ho rrat la tua query e ho ottenuto "" tom: 1, john: 3, timmy: 5, cid: 8, annuncio: 88, nascosto: 99, mn: 33 "' in 'x' variabile, assomiglia alla stringa di input, hai verificato la query? – sll

+0

Ah sì, dovrebbe essere "splitAfter", ovviamente. Grazie per avermi fatto sapere! E sì, lo splitter era sbagliato (la divisione con "," non produce alcun risultato perché non c'è "," nella stringa, lo splitter dovrebbe essere ","). – chrischu

2
string line ="tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
Regex regex = new Regex(@"(\w+?:\s+\d+,\s){3}"); 
string result = regex.Replace(line, "$&<br /> "); 
1

Come ulteriore opzione (anche se l'approccio del ciclo for sarà più performante, mi piace come breve questo è),

assumendo un metodo di estensione come questo:

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int chunkSize) 
{ 
    return source.Where((x,i) => i % chunkSize == 0).Select((x,i) => source.Skip(i * chunkSize).Take(chunkSize)); 
} 

che si rompe un IEnumerable<T> in un IEnumerable<IEnumerable<T>>, è possibile utilizzare il seguente:

var s = "tom: 1, john: 3, timmy: 5, cid: 8, ad: 88, hid: 99, mn: 33"; 
var result = string.Join(", </br>", s.Split(',').Split(3).Select(x => string.Join(",", x))); 
Problemi correlati