2009-10-10 9 views
9

Ich habe eine Schleife, die Adressfelder aufbaut, einige dieser Felder am Ende der Zeichenfolge leer sein kannentfernen

List<string> list = new List<string>(); 

//list can contain any number of values, some of which might be "" (empty string) 

string returnValue = ""; 
for (int iRow = 1; iRow <= list.Count; iRow++) 
    returnValue += String.Format("{0}, ", list[iRow]); 

returnValue = returnValue.Trim(); 

meine Ausgabe ist

asd, aaa, qwe, 123123, , , , , 

Wie kann ich das nachstehende "," aus der Zeichenkette entfernen?

+4

Nein, Sie nicht. Sie haben eine Schleife, die eine ArgumentOutOfRangeException verursacht ... – Guffa

Antwort

21
returnValue = returnValue.TrimEnd(' ', ','); 
+2

Der Parameter auf TrimEnd ist ein ParamArray, Sie brauchen kein neues char [] - returnValue = returnValue.TrimEnd ('', ','); – Nescio

+0

@Nescio Danke, ich denke, in Split-Methode verwende ich regelmäßig Char-Array, um leere Werte zu entfernen, so schrieb ich hier versehentlich. –

2

Die statische TrimEnd-Methode von string ermöglicht die Angabe, welche Zeichen abgeschnitten werden sollen.

in Ihrem Fall jedoch wäre es sinnvoll in der for-Schleife zu überprüfen, ob Sie leere Slots haben, und am Ende zusammen, um eine resultierende Zeichenfolge mit string.Join (string Separator, string [] Teile)

2

Wenn Sie etwas entfernen möchten, das Sie hinzugefügt haben, fügen Sie sie nicht an erster Stelle hinzu. Auch der Typ StringBuilder eignet sich besser zum Verketten mehrerer Strings, da er wesentlich effizienter ist.

StringBuilder sb = new StringBuilder(); 

for (int i = 0; i < list.Count; i++) 
{ 
    string rowValue = list[iRow]; 
    if (!string.IsNullOrEmpty(rowValue)) 
    { 
     sb.Append(rowValue); 
     sb.Append(", "); 
    }  
} 

// use sb.ToString() to obtain result 
+2

Dieser Code erzeugt ein zusätzliches ",", Sie sollten nach der for-Schleife sb.Remove (sb.Length - 2, 2) aufrufen. – Nescio

8

Sie sollten in Ihrem Fall auch die Verwendung von Zeichenfolgen vermeiden, stattdessen StringBuilder verwenden. Vermeiden Sie auch die Verwendung von Senseles-Formatierung - nur die Liste [iRow] ist eine bessere Option.

so etwas wie diese stattdessen versuchen:

string result = string.Join(", ", 
        list.Where(s => !string.IsNullOrEmpty(s)).ToArray()); 
+0

+1 für gut aussehende linq =) –

+0

Es ist erstaunlich, wie viele Dinge LINQ gut löst. –

+0

Wie haben wir jemals ohne LINQ programmiert? –

1

Ich hasse Annahmen zu machen, aber ich will, weil es Sie scheint die „Lücken“ erhalten wollen, bis Sie bis zum Ende erhalten, in diesem Fall sollten Sie TrimEnd verwenden . Wenn nicht, dann verwenden Sie eine der anderen Optionen, um die leeren Werte an erster Stelle zu vermeiden.

Genauer gesagt, wenn die Ausgabe wie folgt aussehen könnte:

asd, aaa, qwe, 123123,,, somevalue, ,

Dann durch Sie eine Schleife haben und verwenden TrimEnd .

Wenn Sie die Felder ausblenden können, schließen Sie das Leergut im Voraus aus.

asd, aaa, qwe, 123123, somevalue

0

try this:

List<string> list = new List<string>(
    new string[]{"asd", "aaa", "qwe", "123123", "", null, "", null, ""}); 
return String.Join(", ", list.Where(i => !String.IsNullOrEmpty(i)).ToArray()); 
0

Ich weiß, dass dies ziemlich unleserlich ist und ist verschwenderisch, aber (ohne Linq):

return string.Join(" ,",string.Join(", ",list.ToArray()).Split(", ", StringSplitOptions.RemoveEmptyEntries)); 
+0

Keine gute Lösung. Einfachste Möglichkeit dies zu tun 'YourString.TrimEnd (',', '');' – Shaharyar

Verwandte Themen