String.Join, который игнорирует пустые строки?

100

Метод VB.NET String.Join(separator, stringArray)похож на метод PHP implode, но любые нулевые элементы в массиве заменяются пустой строкой, поэтому 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 ()
Джеймс Вестгейт

Ответы:

173

VB.NET

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

C #

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

Damith
источник
Я получаю сообщение об ошибке: «Где 'не является членом' System.Array '». И я не вижу ничего о «Где» в MSDN: msdn.microsoft.com/en-us/library/system.array.aspx
Дуг
1
Вместо этого мне повезло с этим: Array.FindAll(myArray, Function(s) Not String.IsNullOrEmpty(s)) можете ли вы изменить свой ответ или объяснить Whereутверждение?
Дуг
7
WhereМетод с System.Linq, msdn.microsoft.com/en-us/library/bb534803.aspx
Damith
50

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

SharpCoder
источник
1
С какой целью опубликовать то же самое, что и принятый ответ stackoverflow.com/a/16326071/461444 два года спустя?
AFract
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);

Это предполагает, что в ваших строках не встречается символ обратного пробела (обычно это должно быть верно, потому что вы не можете просто ввести этот символ с клавиатуры).

Кроме того, если вы получаете значения из базы данных, это еще проще, поскольку вы можете делать это напрямую в 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));

источник
Пожалуйста, рассмотрите возможность добавления дополнительной информации в свой ответ
Индер,
0

Это отлично работает для VB.NET

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

user10642724
источник