String.Join-Methode, die leere Zeichenfolgen ignoriert?


96

Die VB.NET-Methode String.Join(separator, stringArray)ähnelt der implodierten PHP- Methode , jedoch werden alle Nullelemente im Array durch eine leere Zeichenfolge ersetzt, sodass c:

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

Gibt es eine einfache Möglichkeit, eine Reihe von Zeichenfolgen mit einem Trennzeichen zu verketten, das leere Zeichenfolgen ignoriert?

Ich muss nicht unbedingt Arrays oder String.Join oder irgendetwas anderes verwenden. Ich brauche nur die folgenden Transformationen:

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

Als völlig anderer Ansatz könnte es hilfreich sein, dem Array keine Null- oder Leerzeichenfolgen hinzuzufügen, indem Sie eine Erweiterungsmethode erstellen .AddIfNotEmpty ()
James Westgate

Antworten:


170

VB.NET

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

C #

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


Ich erhalte die Fehlermeldung: "'Where' ist kein Mitglied von 'System.Array'". Und ich sehe nichts über "Wo" auf MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug

1
Ich hatte stattdessen etwas Glück damit: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) Können Sie entweder Ihre Antwort ändern oder die WhereAussage erklären ?
Doug

7
WhereMethode ist von System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith

50

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


1
Was ist der Zweck, zwei Jahre später genau das Gleiche wie die akzeptierte Antwort stackoverflow.com/a/16326071/461444 zu veröffentlichen ?
Nach dem

10
@AFract: Überprüfen Sie diese stackoverflow.com/posts/16326071/revisions der Beitrag, den Sie erwähnt haben, wurde Anfang dieses Jahres bearbeitet und zu diesem Zeitpunkt aktualisierten sie die ursprüngliche Antwort hinzugefügt Beispiel für C #
SharpCoder

3

So tun Sie dies in .NET 2.0 (kein LINQ), z. B. für SQL-Server ReportingServices, ohne eine Funktion dafür schreiben zu müssen:

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 # (für diejenigen, die von Google landen und nicht nach VB.NET suchen)

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);

Dies setzt voraus, dass die Zeichenrücktaste in Ihren Zeichenfolgen nicht vorkommt (sollte normalerweise wahr sein, da Sie dieses Zeichen nicht einfach über die Tastatur eingeben können).

Wenn Sie die Werte aus einer Datenbank abrufen, ist dies sogar noch einfacher, da Sie dies direkt in SQL tun können:

PostgreSQL & MySQL:

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

Und selbst mit dem herrlichen MS-SQL-Server ist es möglich (PS: das ist Sarkasmus):

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 

0

Versuche Folgendes:

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

Bitte erwägen Sie, weitere Informationen in Ihre Antwort aufzunehmen
Inder

0

Dies funktioniert gut für VB.NET

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.