120 votes

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

La méthode VB.NET String.Join(separator, stringArray) est similaire à l'implode de PHP, mais tout élément nul dans le tableau est remplacé par une chaîne vide, de sorte quec :

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 de caractères 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"

207voto

Damith Points 32311

VB.NET

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

C#

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

60voto

SharpCoder Points 1167

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

4voto

Quandary Points 12867

Pour le faire en .NET 2.0 (sans LINQ), par exemple pour SQL-Server ReportingServices sans devoir é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 débarquent de google et ne cherchent 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 caractère backspace n'apparaît pas dans vos chaînes de caractères (ce qui devrait normalement être vrai, car vous ne pouvez pas simplement saisir ce caractère au clavier).

De plus, si vous récupérez les valeurs dans une base de données, c'est encore plus simple, puisque 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

-1voto

Essayez ce qui suit :

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

-1voto

user10642724 Points 1

Cela fonctionne bien pour VB.NET

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X