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"
Doug
fonte
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)))

Damith
fonte
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
50

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

SharpCoder
fonte
1
Qual é o propósito de postar exatamente a mesma coisa que a resposta aceita stackoverflow.com/a/16326071/461444 dois anos depois?
AFract
10
@AFract: Verifique este stackoverflow.com/posts/16326071/revisions a postagem que você mencionou foi editada no início deste ano e naquela época eles atualizaram a resposta original adicionada amostra para C #
SharpCoder
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 
Stefan Steiger
fonte
0

Experimente o seguinte:

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

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

user10642724
fonte