String.Join忽略空字符串的方法?

Dou*_*oug 90 .net vb.net string

VB.NET方法String.Join(separator, stringArray)类似于PHP的内爆,但是数组中的任何null元素都替换为空字符串,因此c:

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

有一种简单的方法可以将一组字符串与一个忽略空字符串的分隔符连接起来吗?

我不一定需要使用数组或String.Join或其他任何东西.我只需要以下转换:

("a", "b", "c") --> "a, b, c"
("a", null, "c") --> "a, c"
Run Code Online (Sandbox Code Playgroud)

Dam*_*ith 154

VB.NET

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

C#

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

  • `where`方法来自`System.Linq`,http://msdn.microsoft.com/en-us/library/bb534803.aspx (5认同)
  • 相反,我有一些运气:`Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) ` 你能改变你的答案或解释 `Where` 语句吗? (2认同)

Sha*_*der 47

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

  • @AFract:检查这个https://stackoverflow.com/posts/16326071/revisions你提到的帖子是在今年年初编辑的,当时他们更新了原来的答案为C#添加了样本 (8认同)

Ste*_*ger 6

要在 .NET 2.0(无 LINQ)中执行此操作,例如对于 SQL-Server ReportingServices,无需为其编写函数:

网络

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)
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

这假设字符退格键不会出现在您的字符串中(通常应该是这样,因为您不能简单地通过键盘输入该字符)。

另外,如果您从数据库获取值,那就更简单了,因为您可以直接在 SQL 中执行:

PostgreSQL 和 MySQL:

SELECT 
    concat_ws(' / '
        , NULLIF(searchTerm1, '')
        , NULLIF(searchTerm2, '')
        , NULLIF(searchTerm3, '')
        , NULLIF(searchTerm4, '')
    ) AS RPT_SearchTerms; 
Run Code Online (Sandbox Code Playgroud)

即使使用光荣的 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 
Run Code Online (Sandbox Code Playgroud)


Rya*_*ato 5

另一种选择是使用 LINQ 方便的 null 过滤器:

String.Join(",", myArray.OfType<string>())
Run Code Online (Sandbox Code Playgroud)