Phương thức String.Join bỏ qua các chuỗi trống?


96

Phương thức VB.NET String.Join(separator, stringArray)tương tự như phương thức mã hóa của PHP, nhưng bất kỳ phần tử rỗng nào trong mảng đều được thay thế bằng một chuỗi trống, do đó:

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

Có cách nào đơn giản để nối một tập hợp các chuỗi với một dấu phân cách bỏ qua các chuỗi rỗng không?

Tôi không nhất thiết phải sử dụng mảng hoặc String.Join hoặc bất cứ thứ gì khác. Tôi chỉ cần các phép biến đổi sau:

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

Là một cách tiếp cận hoàn toàn khác, có thể rất tuyệt nếu không thêm chuỗi rỗng hoặc chuỗi rỗng vào mảng bằng cách tạo một phương thức mở rộng .AddIfNotEmpty ()
— James Westgate

Câu trả lời:


170

VB.NET

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

C #

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


Tôi gặp lỗi: "'Where' không phải là thành viên của 'System.Array'". Và tôi không thấy bất cứ điều gì về 'Ở đâu' trên MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
— Doug

1
Thay vào đó, tôi đã gặp may với điều này: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) Bạn có thể thay đổi câu trả lời của mình hoặc giải thích Wherecâu nói không?
— Doug

7
Wherephương thức là từ System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
— Damith

50

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


1
Mục đích của việc đăng chính xác điều giống với câu trả lời được chấp nhận stackoverflow.com/a/16326071/461444 hai năm sau là gì?
— AFract

10
@AFract: Kiểm tra này stackoverflow.com/posts/16326071/revisions bài viết mà bạn đề cập đã được chỉnh sửa vào đầu năm nay và tại thời điểm đó họ cập nhật các câu trả lời ban thêm mẫu cho C #
— SharpCoder

3

Để làm điều đó trong .NET 2.0 (không có LINQ), ví dụ: cho SQL-Server ReportingServices mà không cần phải viết một hàm cho nó:

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 # (cho những người đến từ google và không tìm kiếm 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);

Điều này giả định rằng ký tự xóa lùi không xảy ra trong chuỗi của bạn (thường phải đúng, vì bạn không thể chỉ cần nhập ký tự này bằng bàn phím).

Ngoài ra, nếu bạn lấy các giá trị từ cơ sở dữ liệu, thì nó thậm chí còn đơn giản hơn, vì bạn có thể thực hiện trực tiếp trong SQL:

PostgreSQL & MySQL:

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

Và ngay cả với MS-SQL-Server huy hoàng, điều đó có thể xảy ra (PS: đó là lời mỉa mai):

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

Hãy thử những cách sau:

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

vui lòng cân nhắc thêm thông tin vào câu trả lời của bạn
— Inder

0

Điều này hoạt động tốt cho VB.NET

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.