2013-05-01 16 views
66

Il metodo VB.NET String.Join(separator, stringArray) è simile a implodere PHP, ma eventuali elementi null nell'array vengono sostituiti con una stringa vuota, così thatc:String.Join metodo che ignora le stringhe vuote?

Dim myArray() as String = { "a", null, "c" } 
Console.WriteLine(String.Join(", ", myArray)); 
// Prints "a, , c" 

C'è un modo semplice per concatenare un insieme di stringhe con un separatore che ignora le stringhe vuote?

Non ho necessariamente bisogno di utilizzare matrici o String.Join o qualsiasi altra cosa. Ho solo bisogno le seguenti trasformazioni:

("a", "b", "c") --> "a, b, c" 
("a", null, "c") --> "a, c" 

risposta

91

VB.NET

String.Join(",", myArray.Where(Function(s) Not String.IsNullOrEmpty(s)))

C#

String.Join(",", myArray.Where(s => !string.IsNullOrEmpty(s)))

+0

Mi viene visualizzato un errore: "'Dove' non è un membro di 'System.Array'". E non vedo nulla su "Where" su MSDN: http://msdn.microsoft.com/en-us/library/system.array.aspx – Doug

+0

Ho avuto un po 'di fortuna con questo invece: 'Array.FindAll (myArray , Funzione (i) Not String.IsNullOrEmpty (s)) 'Puoi cambiare la risposta o spiegare l'istruzione' Where'? – Doug

+2

Il metodo '' '' proviene da 'System.Linq', http://msdn.microsoft.com/en-us/library/bb534803.aspx – Damith

42

per C# ==>String.Join(",", arr.Where(s => !String.IsNullOrEmpty(s)));

+1

Qual è lo scopo di pubblicare esattamente la stessa cosa della risposta accettata https: // stackoverflow.com/a/16326071/461444 due anni dopo? – AFract

+3

@AFract: controlla questo https://stackoverflow.com/posts/16326071/revisions il post che hai citato è stato modificato all'inizio di quest'anno e in quel momento hanno aggiornato la risposta originale aggiunto campione per C# – SharpCoder

1

Per farlo in .NET 2.0 (senza LINQ), ad es. per ReportingServices SQL-Server senza dover scrivere una funzione per esso:

VB.NET

Dim a As String = "", b As String = "b", c As String = "", d As String = "d", e As String = "" 
Dim lala As String = String.Join("/", String.Join(vbBack, New String() {a, b, c, d, e}).Split(New Char() {ControlChars.Back}, System.StringSplitOptions.RemoveEmptyEntries)) 

System.Console.WriteLine(lala) 

C# (per chi lo sbarco da parte di Google e non alla ricerca di VB.NET)

string a = "", b = "b", c = "", d = "d", e = ""; 
string lala = string.Join("/", 
    string.Join("\u0008", 
     new string[] { a, b, c, d, e } 
    ).Split(new char[] { '\u0008' }, System.StringSplitOptions.RemoveEmptyEntries) 
); 

System.Console.WriteLine(lala); 

Ciò presuppone che il carattere backspace non si verifichi nelle stringhe (di solito dovrebbe essere vero, perché non puoi semplicemente inserire questo carattere per tastiera).

Inoltre, se si ottiene i valori da un database, allora è ancora più semplice, dato che è possibile farlo in SQL direttamente:

PostgreSQL & MySQL:

SELECT 
    concat_ws('/' 
     , NULLIF(searchTerm1, '') 
     , NULLIF(searchTerm2, '') 
     , NULLIF(searchTerm3, '') 
     , NULLIF(searchTerm4, '') 
    ) AS RPT_SearchTerms; 

E anche con la gloriosa MS -SQL-Server è possibile (PS: quello è sarcasmo):

DECLARE @in_SearchTerm1 nvarchar(100) 
DECLARE @in_SearchTerm2 nvarchar(100) 
DECLARE @in_SearchTerm3 nvarchar(100) 
DECLARE @in_SearchTerm4 nvarchar(100) 

SET @in_SearchTerm1 = N'a' 
SET @in_SearchTerm2 = N'' 
SET @in_SearchTerm3 = N'c' 
SET @in_SearchTerm4 = N'' 

SELECT 
    COALESCE 
    (
     STUFF 
     (
      (
       SELECT '/' + RPT_SearchTerm AS [text()] 
       FROM 
       (
            SELECT NULLIF(@in_SearchTerm1, N'') AS RPT_SearchTerm, 1 AS RPT_Sort 
         UNION ALL SELECT NULLIF(@in_SearchTerm2, N'') AS RPT_SearchTerm, 2 AS RPT_Sort 
         UNION ALL SELECT NULLIF(@in_SearchTerm3, N'') AS RPT_SearchTerm, 3 AS RPT_Sort 
         UNION ALL SELECT NULLIF(@in_SearchTerm4, N'') AS RPT_SearchTerm, 4 AS RPT_Sort 
       ) AS tempT 
       WHERE RPT_SearchTerm IS NOT NULL 
       ORDER BY RPT_Sort 
       FOR XML PATH(N''), TYPE 
      ).value('.', 'nvarchar(MAX)') 
      ,1 
      ,3 
      ,N'' 
     ) 
     ,N'' 
    ) AS RPT_SearchTerms 
Problemi correlati