2010-10-07 1 views
48

Szybkie pytanie tutaj. Konwertuję tablicę na ciąg znaków za pomocą String.Join. Mam mały problem, że w tablicy niektóre pozycje indeksu będą puste. Przykładem jest poniżej:Usuwanie dodatkowych przecinków z ciągu po użyciu String.Join w celu konwersji tablicy na ciąg (C#)

array[1] = "Firstcolumn" 
array[3] = "Thirdcolumn" 

Korzystając string.join ("", array) ;, Wezmę następujące:

Firstcolumn ,, Thirdcolumn

Uwaga statysta ,. Jak mogę usunąć dodatkowe przecinki ze sznurka, lub najlepiej nie zawierać pustych indeksów podczas korzystania z String.Join?

+0

Po dołączyć użytkowania string.replace (”,, "", "); –

+5

@sh_kamalh To nie poradziłoby z przypadkiem "1 ,,, 2". –

Odpowiedz

83

Spróbuj :):

var res = string.Join(",", array.Where(s => !string.IsNullOrEmpty(s))); 

ten dołączy tylko struny, która nie jest null lub "".

+17

Podoba mi się fakt, że zajmujesz się problemem, a nie tylko bandażem problemu z hackerem! –

3

Możesz użyć linq, aby usunąć puste pola.

var joinedString = String.Join(",", array.Where(c => !string.IsNullOrEmpty(c)); 
+0

Zapytał w jaki sposób, nie tylko w teorii, wypróbować kod źródłowy? –

34

Prostym rozwiązaniem byłoby użycie linq, poprzez odfiltrowanie pustych elementów przed dołączeniem.

// .net 3.5 
string.Join(",", array.Where(item => !string.IsNullOrEmpty(item)).ToArray()); 

w .NET 4.0 można również skorzystać z string.IsNullOrWhiteSpace jeśli chcesz odfiltrować elementy, które są puste lub składające się z białych znaków tylko (zauważ, że w .NET 4.0 nie trzeba nazwać ToArray w tym przypadku): metoda

// .net 4.0 
string.Join(",", array.Where(item => !string.IsNullOrWhiteSpace(item))); 
+4

+1, ponieważ w momencie pisania jest jedyną odpowiedzią na wspomnienie ToArray (który nawiasem mówiąc jest niepotrzebny w .NET 4). –

+4

+1 Dla rozwiązania .Net <= 4 :) –

1

przedłużenie:

public static string ToStringWithoutExtraCommas(this object[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (object o in array) 
    { 

     if ((o is string && !string.IsNullOrEmpty((string)o)) || o != null) 
      sb.Append(o.ToString()).Append(","); 
    } 

    sb.Remove(sb.Length - 1, 1); 

    return sb.ToString(); 
} 
+0

Nie spowoduje to wstawienia przecinków. Ale on * chce * przecinki, po prostu nie po pustych hasłach. – gehho

+0

Ups, edycja tego, dzięki –

+0

-1 ciąg może być pusty bez wartości null, w takim przypadku dodatkowe przecinki są uwzględniane w każdym razie. – bernhof

1

Zwykły roztwór wyrażenie:

yourString = new Regex(@"[,]{2,}").Replace(yourString, @","); 
1
String.Join(",", array.Where(w => !string.IsNullOrEmpty(w)); 
0
string.Join(",", Array.FindAll(array, a => !String.IsNullOrEmpty(a))); 

Jak o tym? Wady i zalety w porównaniu do rozwiązania LINQ? Przynajmniej krótszy.

0
string.Join(",", string.Join(",", array).Split({","}, StringSplitOptions.RemoveEmptyEntries)); 

v

0

Prosta metoda rozszerzenie

namespace System 
{ 
    public static class Extenders 
    { 
     public static string Join(this string separator, bool removeNullsAndWhiteSpaces, params string[] args) 
     { 
      return removeNullsAndWhiteSpaces ? string.Join(separator, args?.Where(s => !string.IsNullOrWhiteSpace(s))) : string.Join(separator, args); 
     } 
     public static string Join(this string separator, bool removeNullsAndWhiteSpaces, IEnumerable<string> args) 
     { 
      return removeNullsAndWhiteSpaces ? string.Join(separator, args?.Where(s => !string.IsNullOrWhiteSpace(s))) : string.Join(separator, args); 
     } 
    } 
} 

Usage ('_') V:

var str = ".".Join(true, "a", "b", "", "c"); 
//or 
var arr = new[] { "a", "b", "", "c" }; 
str = ".".Join(true, arr);