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"

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


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


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 

0

Intente lo siguiente:

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.