Método String.Join que ignora strings vazias?


96

O método VB.NET String.Join(separator, stringArray)é semelhante ao implode do PHP, mas todos os elementos nulos na matriz são substituídos por uma string vazia, de modo que:

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

Existe uma maneira simples de concatenar um conjunto de strings com um separador que ignora strings vazias?

Eu não preciso necessariamente usar matrizes ou String.Join ou qualquer outra coisa. Eu só preciso das seguintes transformações:

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

Como uma abordagem completamente diferente, pode ser bom não adicionar strings nulas ou vazias ao array criando um método de extensão .AddIfNotEmpty ()
James Westgate

Respostas:


170

VB.NET

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

C #

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


Estou recebendo um erro: "'Onde' não é membro de 'System.Array'". E não vejo nada sobre 'Onde' no MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug

1
Em vez disso, tive sorte: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) Você pode mudar sua resposta ou explicar a Whereafirmação?
Doug

7
Wheremétodo é de System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith


3

Para fazer isso em .NET 2.0 (sem LINQ), por exemplo, para SQL-Server ReportingServices sem ter que escrever uma função para ele:

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 aqueles que vêm do Google e não procuram 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);

Isso pressupõe que o retrocesso do caractere não ocorre em suas strings (geralmente deve ser verdadeiro, porque você não pode simplesmente inserir esse caractere pelo teclado).

Além disso, se você obter os valores de um banco de dados, será ainda mais simples, pois você pode fazer isso diretamente no SQL:

PostgreSQL e MySQL:

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

E mesmo com o glorioso MS-SQL-Server é possível (PS: isso é 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

Experimente o seguinte:

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

considere adicionar mais informações em sua resposta
Inder

0

Isso funciona bem para VB.NET

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.