空の文字列を無視するString.Joinメソッド?


96

VB.NETメソッドString.Join(separator, stringArray)はPHPのimplodeに似ていますが、配列内のnull要素は空の文字列に置き換えられるため、c:

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

空の文字列を無視する区切り文字で一連の文字列を連結する簡単な方法はありますか?

必ずしも配列やString.Joinなどを使用する必要はありません。次の変換が必要です。

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

完全に異なるアプローチとしては、拡張メソッド.AddIfNotEmpty()を作成することによって、アレイにヌルまたは空の文字列を追加しないようにいいかもしれない
ジェームズウエストゲート

回答:


170

VB.NET

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

C#

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


「「Where」は「System.Array」のメンバーではありません」というエラーが表示されます。また、MSDNで「どこ」に何も表示されません:msdn.microsoft.com/en-us/library/system.array.aspx
Doug

1
代わりに私はこれで運が良かった:Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) 答えを変えるか、Where声明を説明できるか?
2013年

7
WhereメソッドはSystem.Linqmsdn.microsoft.com
en

50

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


1
承認された回答とまったく同じものを2年後にスタックオーバーフロー.com / a / 16326071/461444に投稿する目的は何ですか?
AFract、2017

10
@AFract:このstackoverflow.com/posts/16326071/revisionsを確認してください。あなたが言及した投稿が今年の初めに編集され、その時点でC#のサンプルが追加されました
SharpCoder 2017

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);

これは、文字列で文字のバックスペースが発生しないことを前提としています(キーボードでこの文字を入力することはできないため、通常はtrueになります)。

また、データベースから値を取得する場合は、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

0

これはVB.NETで正常に動作します

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.