วิธี String.Join ที่ละเว้นสตริงว่าง?


102

วิธี VB.NET String.Join(separator, stringArray)นั้นคล้ายกับการระเบิดของ PHP แต่องค์ประกอบที่เป็นโมฆะใด ๆ ในอาร์เรย์จะถูกแทนที่ด้วยสตริงว่างดังนั้น c:

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

มีวิธีง่ายๆในการเชื่อมชุดของสตริงด้วยตัวคั่นที่ละเว้นสตริงว่างหรือไม่?

ฉันไม่จำเป็นต้องใช้อาร์เรย์หรือสตริงเข้าร่วมหรืออย่างอื่น ฉันแค่ต้องการการเปลี่ยนแปลงต่อไปนี้:

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

ในฐานะที่เป็นวิธีการที่แตกต่างไปจากเดิมอย่างสิ้นเชิงอาจเป็นการดีที่จะไม่เพิ่มสตริงว่างหรือว่างเปล่าลงในอาร์เรย์โดยการสร้างเมธอดส่วนขยาย AddIfNotEmpty ()
James Westgate

@JamesWestgate ว่าเป็นแนวทางที่มีประโยชน์หรือไม่นั้นขึ้นอยู่กับกลไกที่เติมอาร์เรย์และส่วนอื่นของโปรแกรมใช้อาร์เรย์หรือไม่
Stewart

คำตอบ:


175

VB.NET

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

ค#

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


ฉันได้รับข้อผิดพลาด: "" โดยที่ "ไม่ใช่สมาชิกของ" System.Array "" และฉันไม่เห็นอะไรเกี่ยวกับ 'Where' บน MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Doug

2
ฉันโชคดีกับเรื่องนี้แทน: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) คุณสามารถเปลี่ยนคำตอบหรืออธิบายWhereข้อความได้หรือไม่?
Doug

7
WhereวิธีการจากSystem.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith

51

สำหรับ C # ==> String.Join(",", arr.Where(s => !String.IsNullOrEmpty(s)));


1
อะไรคือจุดประสงค์ของการโพสต์สิ่งเดียวกับคำตอบที่ยอมรับstackoverflow.com/a/16326071/461444สองปีต่อมา
หลัง

10
@AFract: ตรวจสอบstackoverflow.com/posts/16326071/revisionsโพสต์ที่คุณกล่าวถึงได้รับการแก้ไขเมื่อต้นปีนี้และในเวลานั้นพวกเขาอัปเดตคำตอบเดิมที่เพิ่มตัวอย่างสำหรับ C #
SharpCoder

3

หากต้องการทำใน. NET 2.0 (ไม่มี LINQ) เช่นสำหรับ SQL-Server ReportingServices โดยไม่ต้องเขียนฟังก์ชันให้:

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 # (สำหรับผู้ที่เชื่อมโยงไปถึงจาก google และไม่ค้นหา 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);

สิ่งนี้จะถือว่าอักขระ backspace ไม่เกิดขึ้นในสตริงของคุณ (โดยปกติควรเป็นจริงเพราะคุณไม่สามารถป้อนอักขระนี้ด้วยแป้นพิมพ์ได้)

นอกจากนี้หากคุณได้รับค่าจากฐานข้อมูลก็จะยิ่งง่ายกว่าเดิมเนื่องจากคุณสามารถทำได้ใน SQL โดยตรง:

PostgreSQL และ MySQL:

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

และแม้จะมี MS-SQL-Server อันรุ่งโรจน์ก็เป็นไปได้ (PS: นั่นคือการถากถาง):

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

ลองทำดังต่อไปนี้:

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

กรุณาพิจารณาการเพิ่มข้อมูลเพิ่มเติมในคำตอบของคุณ
Inder

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.