Méthode String.Join qui ignore les chaînes vides?

96

La méthode VB.NET String.Join(separator, stringArray)est similaire à l'implode de PHP, mais tous les éléments nuls du tableau sont remplacés par une chaîne vide, de sorte que c:

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

Existe-t-il un moyen simple de concaténer un ensemble de chaînes avec un séparateur qui ignore les chaînes vides?

Je n'ai pas nécessairement besoin d'utiliser des tableaux ou String.Join ou quoi que ce soit d'autre. J'ai juste besoin des transformations suivantes:

("a", "b", "c") --> "a, b, c"
("a", null, "c") --> "a, c"
Doug
la source
Comme approche complètement différente, il peut être intéressant de ne pas ajouter de chaînes nulles ou vides au tableau en créant une méthode d'extension .AddIfNotEmpty ()
James Westgate

Réponses:

170

VB.NET

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

C #

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

Damith
la source
J'obtiens une erreur: "'Where' n'est pas membre de 'System.Array'". Et je ne vois rien à propos de 'Où' sur MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug
1
J'ai eu un peu de chance avec ceci à la place: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) pouvez-vous changer votre réponse ou expliquer la Wheredéclaration?
Doug
7
Wherela méthode est de System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith
50

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

SharpCoder
la source
1
Quel est le but de publier exactement la même chose que la réponse acceptée stackoverflow.com/a/16326071/461444 deux ans plus tard?
AFract
10
@AFract: Vérifiez ce stackoverflow.com/posts/16326071/revisions le message que vous avez mentionné a été édité au début de cette année et à ce moment-là, ils ont mis à jour la réponse originale a ajouté un exemple pour C #
SharpCoder
3

Pour le faire en .NET 2.0 (pas de LINQ), par exemple pour SQL-Server ReportingServices sans avoir à écrire une fonction pour cela:

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 # (pour ceux qui arrivent de Google et ne recherchent pas 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);

Cela suppose que le retour arrière du caractère ne se produit pas dans vos chaînes (devrait généralement être vrai, car vous ne pouvez pas simplement entrer ce caractère au clavier).

De plus, si vous récupérez les valeurs d'une base de données, c'est encore plus simple, car vous pouvez le faire directement en SQL:

PostgreSQL et MySQL:

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

Et même avec le glorieux MS-SQL-Server, c'est possible (PS: c'est du sarcasme):

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 
Stefan Steiger
la source
0

Essayez ce qui suit:

var finalString = String.Join(",", ExampleArrayOfObjects.Where(x => !String.IsNullOrEmpty(x.TestParameter)).Select(x => x.TestParameter));

la source
veuillez envisager d'ajouter plus d'informations dans votre réponse
Inder
0

Cela fonctionne bien pour VB.NET

Join(*yourArray*.Where(Function(s) Not String.IsNullOrEmpty(s)).ToArray(), *yourDelimiter*)

utilisateur10642724
la source