2010-10-07 13 views
48

Kurze Frage hier zu konvertieren. Ich konvertiere ein Array in einen String mit String.Join. Ein kleines Problem, das ich habe, ist, dass in dem Array einige Indexpositionen leer sind. Ein Beispiel ist unten:zusätzliche Komma aus Zeichenfolge Entfernen nach String.Join mit Array string (C#)

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

von String.Join mit ("", array) ;, Ich werde die erhalten folgende:

Firstcolumn ,, Thirdcolumn

Hinweis Das Extra ,. Wie kann ich die zusätzlichen Kommas aus der Zeichenfolge entfernen oder idealerweise keine leeren Indizes bei der Verwendung von String.Join?

+0

Nach Gebrauch String.Replace (“,, "" join, "); –

+5

@sh_kamalh Das würde nicht den Fall von "1 ,,, 2" behandeln. –

Antwort

83

dieses :) Versuchen:

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

Diese nur die Saiten beitreten werden, die nicht null oder "" ist.

+17

Ich mag die Tatsache, dass Sie die Ursache des Problems angehen und nicht nur das Problem mit einem Hack verbinden! –

3

Sie könnten Linq verwenden, um die leeren Felder zu entfernen.

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

Er fragte speziell, wie, nicht nur in der Theorie, versuchen, Code zu liefern? –

34

Eine einfache Lösung wäre linq zu verwenden, indem die leeren Elemente Ausfiltern vor dem Verbinden.

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

In .NET 4.0 können Sie dort auch von string.IsNullOrWhiteSpace machen könnte, wenn man auch die Elemente herausfiltern möchten, die leer sind oder nur Leerzeichen bestehen (das 4.0 Sie nicht .NET in Kenntnis zu nennen ToArray in diesem Fall):

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

+1 für die zum Zeitpunkt des Schreibens die einzige Antwort sein ToArray zu erwähnen (die übrigens in .NET 4 nicht erforderlich ist). –

+4

+1 Für eine .Net <= 4 Lösung :) –

1

Erweiterungsmethode:

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

Dadurch werden alle Kommata überhaupt nicht ein. Aber er will * Kommas, nur nicht nach leeren Einträgen. – gehho

+0

Hoppla, editieren das, danke –

+0

-1 ein String kann leer sein, ohne null zu sein, in diesem Fall sind die zusätzlichen Kommas sowieso enthalten. – bernhof

1

Regulärer Ausdruck Lösung:

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

Wie wäre es mit diesem? Nachteile und Vorteile im Vergleich zur LINQ-Lösung? Zumindest ist es kürzer.

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

v ('_') V

0

einfache Erweiterungsmethode

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:

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