String.Join método que ignora cadenas vacías?

96

El método VB.NET String.Join(separator, stringArray)es similar a la implosión de PHP, pero cualquier elemento nulo en la matriz se reemplaza con una cadena vacía, por lo que c:

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

¿Existe una forma sencilla de concatenar un conjunto de cadenas con un separador que ignora las cadenas vacías?

No necesariamente necesito usar matrices o String.Join o cualquier otra cosa. Solo necesito las siguientes transformaciones:

("a", "b", "c") --> "a, b, c"
("a", null, "c") --> "a, c"
Doug
fuente
Como un enfoque completamente diferente, podría ser bueno no agregar cadenas nulas o vacías a la matriz creando un método de extensión .AddIfNotEmpty ()
James Westgate

Respuestas:

170

VB.NET

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

C#

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

Damith
fuente
Recibo un error: "'Where' no es un miembro de 'System.Array'". Y no veo nada sobre 'Dónde' en MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug
1
En cambio, tuve suerte con esto: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) ¿Puedes cambiar tu respuesta o explicar la Whereafirmación?
Doug
7
WhereEl método es de System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith
50

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

SharpCoder
fuente
1
¿Cuál es el propósito de publicar exactamente lo mismo que la respuesta aceptada stackoverflow.com/a/16326071/461444 dos años después?
AFract
10
@AFract: revise esto stackoverflow.com/posts/16326071/revisions, la publicación que mencionó se editó a principios de este año y en ese momento actualizaron la muestra de respuesta original agregada para C #
SharpCoder
3

Para hacerlo en .NET 2.0 (sin LINQ), por ejemplo, para SQL-Server ReportingServices sin tener que escribir una función para ello:

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 # (para aquellos que aterrizan en Google y no buscan 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);

Esto supone que el retroceso del carácter no ocurre en sus cadenas (normalmente debería ser cierto, porque no puede simplemente ingresar este carácter con el teclado).

Además, si obtiene los valores de una base de datos, entonces es aún más simple, ya que puede hacerlo en SQL directamente:

PostgreSQL y MySQL:

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

E incluso con el glorioso MS-SQL-Server es posible (PD: eso es 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 
Stefan Steiger
fuente
0

Intente lo siguiente:

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

fuente
por favor considere agregar más información en su respuesta
Inder
0

Esto funciona bien para VB.NET

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

usuario10642724
fuente