2010-10-07 10 views
48

Domanda veloce qui. Sto convertendo un array in una stringa usando String.Join. Un piccolo problema che ho è che nell'array alcune posizioni dell'indice saranno vuote. Un esempio è qui sotto:Rimozione di più virgole dalla stringa dopo aver usato String.Join per convertire l'array in stringa (C#)

array[1] = "Firstcolumn" 
array[3] = "Thirdcolumn" 

Utilizzando String.Join ("", array) ;, vado a prendere il seguente:

firstColumn ,, Thirdcolumn

Nota l'extra,. Come posso rimuovere le virgole extra dalla stringa, o idealmente non includere indici vuoti quando si usa String.Join?

+0

Dopo unirsi uso String.Replace (" ,, "", "); –

+5

@sh_kamalh Questo non gestirà il caso di "1 ,,, 2". –

risposta

83

Prova questa :):

var res = string.Join(",", array.Where(s => !string.IsNullOrEmpty(s))); 

Questo si uniranno solo le stringhe che non è null o "".

+17

Mi piace il fatto che stai affrontando la causa del problema e non limitandoti a bendare il problema con un trucco! –

3

È possibile utilizzare linq per rimuovere i campi vuoti.

var joinedString = String.Join(",", array.Where(c => !string.IsNullOrEmpty(c)); 
+0

Ha chiesto specificamente come, non solo in teoria, provare il codice di alimentazione? –

34

Una soluzione semplice sarebbe usare linq, filtrando gli elementi vuoti prima di unirsi.

// .net 3.5 
string.Join(",", array.Where(item => !string.IsNullOrEmpty(item)).ToArray()); 

In .NET 4.0 si potrebbe anche fare uso di string.IsNullOrWhiteSpace se anche voi volete filtrare gli elementi che sono vuote o costituiti da spazi vuoti solo (si noti che in .NET 4.0 non è necessario chiamare ToArray in questo caso): metodo

// .net 4.0 
string.Join(",", array.Where(item => !string.IsNullOrWhiteSpace(item))); 
+4

+1 al momento della scrittura è l'unica risposta a menzionare ToArray (che tra l'altro non è necessario in .NET 4). –

+4

+1 per una soluzione .Net <= 4 :) –

1

Estensione:

public static string ToStringWithoutExtraCommas(this object[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (object o in array) 
    { 

     if ((o is string && !string.IsNullOrEmpty((string)o)) || o != null) 
      sb.Append(o.ToString()).Append(","); 
    } 

    sb.Remove(sb.Length - 1, 1); 

    return sb.ToString(); 
} 
+0

Questo non inserirà nessuna virgola. Ma lui * vuole * virgole, solo non dopo le voci vuote. – gehho

+0

Oops, modificando questo, grazie –

+0

-1 una stringa può essere vuota senza essere nulla, nel qual caso le virgole aggiuntive sono comunque incluse. – bernhof

1

soluzione espressione regolare:

yourString = new Regex(@"[,]{2,}").Replace(yourString, @","); 
1
String.Join(",", array.Where(w => !string.IsNullOrEmpty(w)); 
0
string.Join(",", Array.FindAll(array, a => !String.IsNullOrEmpty(a))); 

Che ne dici di questo? Contro e pro rispetto alla soluzione LINQ? Almeno è più breve.

0
string.Join(",", string.Join(",", array).Split({","}, StringSplitOptions.RemoveEmptyEntries)); 

v ('_') V

0

metodo di estensione semplice

namespace System 
{ 
    public static class Extenders 
    { 
     public static string Join(this string separator, bool removeNullsAndWhiteSpaces, params string[] args) 
     { 
      return removeNullsAndWhiteSpaces ? string.Join(separator, args?.Where(s => !string.IsNullOrWhiteSpace(s))) : string.Join(separator, args); 
     } 
     public static string Join(this string separator, bool removeNullsAndWhiteSpaces, IEnumerable<string> args) 
     { 
      return removeNullsAndWhiteSpaces ? string.Join(separator, args?.Where(s => !string.IsNullOrWhiteSpace(s))) : string.Join(separator, args); 
     } 
    } 
} 

Usage:

var str = ".".Join(true, "a", "b", "", "c"); 
//or 
var arr = new[] { "a", "b", "", "c" }; 
str = ".".Join(true, arr); 
Problemi correlati