2013-05-01 10 views
66

Sposób VB.NET String.Join(separator, stringArray) jest podobna implodować PHP, ale wszelkie elementy zerowe w tablicy zostaną zastąpione pustym ciągiem znaków, tak thatc:Metoda String.Join ignoruje puste ciągi znaków?

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

Czy istnieje prosty sposób aby złączyć zbiór łańcuchów z separator, który ignoruje puste struny?

Niekoniecznie muszę używać tablic lub String.Join lub cokolwiek innego. Muszę tylko następujące transformacje:

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

Odpowiedz

91

VB.NET

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

C#

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

+0

Otrzymuję błąd: "" Gdzie "nie jest członkiem" System.Array "". I nie widzę nic o "Gdzie" na MSDN: http://msdn.microsoft.com/en-us/library/system.array.aspx – Doug

+0

Miałem trochę szczęścia z tym zamiast: 'Array.FindAll (myArray , Function (s) Not String.IsNullOrEmpty (s)) 'Czy możesz zmienić odpowiedź lub wyjaśnić instrukcję' Where'? – Doug

+2

Metoda 'Where' pochodzi z' System.Linq', http://msdn.microsoft.com/en-us/library/bb534803.aspx – Damith

42

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

+1

Jaki jest cel publikowania dokładnie tego samego, co zaakceptowana odpowiedź https: // stackoverflow.com/a/16326071/461444 dwa lata później? – AFract

+3

@AFract: Sprawdź ten https://stackoverflow.com/posts/16326071/revisions, o którym wspomniałeś, że był edytowany na początku tego roku iw tym czasie zaktualizowali oryginalną odpowiedź dodano próbkę dla C# – SharpCoder

1

Aby to zrobić w .NET 2.0 (bez LINQ), np. dla ReportingServices SQL-Server, bez konieczności napisać funkcję dla niego:

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# (dla tych, lądując z google i nie szukając 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); 

Zakłada się, że backspace znaków nie występuje w łańcuchach znaków (powinno być to zazwyczaj prawdą, ponieważ nie można po prostu wprowadzić tej litery za pomocą klawiatury).

Ponadto, jeśli uzyskać wartości z bazy danych, to jest to jeszcze prostsze, ponieważ można to zrobić w SQL bezpośrednio:

PostgreSQL & MySQL:

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

a nawet z chwalebnej MS -SQL-Server to możliwe (PS: to sarkazm):

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 
Powiązane problemy