String.Join metode yang mengabaikan string kosong?

100

Metode VB.NET String.Join(separator, stringArray)mirip dengan implode PHP, tetapi elemen null apa pun dalam array diganti dengan string kosong, jadi c:

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

Apakah ada cara sederhana untuk menggabungkan sekumpulan string dengan pemisah yang mengabaikan string kosong?

Saya tidak perlu menggunakan array atau String.Join atau yang lainnya. Saya hanya perlu transformasi berikut:

("a", "b", "c") --> "a, b, c"
("a", null, "c") --> "a, c"
Doug
sumber
Sebagai pendekatan yang sama sekali berbeda, mungkin lebih baik untuk tidak menambahkan string kosong atau kosong ke array dengan membuat metode ekstensi .AddIfNotEmpty ()
James Westgate

Jawaban:

173

VB.NET

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

C #

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

Sial
sumber
Saya mendapatkan pesan kesalahan: "'Di mana' bukan anggota dari 'System.Array'". Dan saya tidak melihat apa pun tentang 'Where' di MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug
1
Saya beruntung dengan ini sebagai gantinya: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) Dapatkah Anda mengubah jawaban Anda atau menjelaskan Wherepernyataannya?
Doug
7
Wheremetode adalah dari System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith
50

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

SharpCoder
sumber
1
Apa tujuan memposting hal yang persis sama dengan jawaban stackoverflow.com/a/16326071/461444 yang diterima dua tahun kemudian?
AFrak
10
@AFract: Periksa stackoverflow.com/posts/16326071/revisi posting yang Anda sebutkan telah diedit awal tahun ini dan pada saat itu mereka memperbarui jawaban asli menambahkan sampel untuk C #
SharpCoder
3

Untuk melakukannya di .NET 2.0 (tanpa LINQ), misalnya untuk SQL-Server ReportingServices tanpa harus menulis fungsi untuk itu:

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 # (untuk mereka yang mendarat dari google dan tidak mencari 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);

Ini mengasumsikan bahwa spasi mundur karakter tidak terjadi dalam string Anda (biasanya harus benar, karena Anda tidak bisa begitu saja memasukkan karakter ini dengan keyboard).

Selain itu, jika Anda mendapatkan nilai dari database, ini lebih sederhana lagi, karena Anda dapat melakukannya di SQL secara langsung:

PostgreSQL & MySQL:

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

Dan bahkan dengan MS-SQL-Server yang mulia itu mungkin (PS: itu sarkasme):

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
sumber
0

Coba yang berikut ini:

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

sumber
mohon pertimbangkan untuk menambahkan lebih banyak informasi dalam jawaban Anda
Inder
0

Ini berfungsi dengan baik untuk VB.NET

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

pengguna10642724
sumber