Kommagetrennte Zeichenfolge aus der Liste der Elemente

132524
Josh Earl

Gibt es eine einfache Möglichkeit, eine durch Kommas getrennte Zeichenfolge aus einer Liste von Elementen zu erstellen, ohne ein zusätzliches "," an das Ende der Zeichenfolge anzufügen?

Ich muss häufig eine ASP.NET CheckBoxList nehmen und die ausgewählten Werte als Zeichenfolge zum Einfügen in eine E-Mail formatieren. Es ist unkompliziert, die ausgewählten Kontrollkästchen zu durchlaufen, die Werte abzurufen und sie einem StringBuilder hinzuzufügen, indem sie durch ein "," getrennt werden. Die Count-Eigenschaft gibt jedoch die Anzahl der Elemente in der Gesamtliste zurück, nicht die Anzahl der tatsächlich ausgewählten Elemente . Es ist also schwer zu wissen, wann Sie den letzten Punkt erreicht haben und am Ende ein verirrtes "," erhalten.

Ich habe mit verschiedenen Ansätzen für dieses Problem herumgespielt. In letzter Zeit habe ich so etwas gemacht:

private string ConcatenateCheckBoxListItems()
{
    StringBuilder sb = new StringBuilder();
    char[] characters = new char[] {" ", ","};
    String trimmedString;

    foreach (ListItem item in MyList)
    {
        sb.Append(item.Value + ", ");
    }

    trimmedString = sb.ToString().TrimEnd(characters);
    return trimmedString;
}

Aber es ist definitiv klobig. Also die verschiedenen for-Loop-Ansätze, die ich ausprobiert habe. Irgendwelche Vorschläge für eine sauberere Implementierung?

Antworten
51
Trotz der Antworten sollte Ihr Trennzeichen in diesem Code eine Zeichenfolge sein, und das trim-Ende sollte "delimiter.ToCharArray ()" aufrufen, um die Wartung ein wenig zu erleichtern. Nick Larsen vor 9 Jahren 1
Funktioniert dieses [eingebaute] (http://msdn.microsoft.com/de-de/library/system.string.join.aspx), was Sie wollen? Mark Loeser vor 9 Jahren 0

4 Antworten auf die Frage

64
pdr

Würde das nicht ausreichen?

private string ConcatenateCheckBoxListItems()
{
    return string.Join(", ", from item in MyList select item.Value);
}
Cool, woher wusste ich das nicht. : O :) Steven Jeuris vor 9 Jahren 0
@Steven Das ist die Sache mit dem .NET Framework. Du kannst es nicht alles wissen. Sie wissen nur, was Sie wissen mussten. Deshalb gibt es solche Sites. pdr vor 9 Jahren 9
Ich liebe diese Seite absolut. Ja, das ist perfekt, kompakt, elegant ... Ich fühle mich jeden Tag mehr als Neuling. :) Josh Earl vor 9 Jahren 0
Kümmert sich das darum, dass Ihre Listenwerte vor den enthaltenen ',' - Zeichen stehen? thedev vor 9 Jahren 0
@thedev Nein, aber es könnte leicht erweitert werden. Ändern Sie einfach das Bit nach der Auswahl, um entweder die Kommas `item.Value.Replace (", ", @" \, ")` zu ersetzen oder die Zeichenfolge in Anführungszeichen `item.Value.Contains (", ") zu setzen. string.Format (@ "" "{0}" "", item.Value): item.Value`. Was auch immer Sie brauchen pdr vor 9 Jahren 2
Python? In * meinem * C #? Im Ernst, ich wusste nicht, dass Sie solche Zauberei in C # ausführen können. Gute Antwort. Humphrey Bogart vor 9 Jahren 3
25
Snowbear

Warum nicht string.Join()?

var result = string.Join(", ", MyList.Items.Select(i => i.Value));
Ich ziehe es sehr vor, dies inline zu tun, anstatt es in einer Methode wie in der akzeptierten Antwort einzuwickeln. Johan Larsson vor 5 Jahren 2
5
Jay Bazuzi

string.Join() ist eine gute Antwort, aber ich bevorzuge eine Erweiterungsmethode:

namespace StringExtensions
{
    static class _
    {
        public static string JoinString<T>(this IEnumerable<T> source, string seperator = "")
        {
            return string.Join(seperator, source);
        }
    }
}

was ist wie folgt verwendet:

return MyList.Select(i => i.Value).JoinString(", ");

(Ich verwende meine unkonventionelle Methode zum Organisieren von Erweiterungsmethoden, die Sie hier lesen können: http://jbazuzicode.blogspot.com/2009/01/way-to-manage-extension-methods-in-c.html ) .

Ich habe eine noch unkonventionellere Methode, ich setze sie in die entsprechenden `System`-Namespaces. :) Keine Notwendigkeit, Usings hinzuzufügen. Ich entscheide immer noch, ob ich diese Praxis beibehalten möchte oder nicht (http://stackoverflow.com/q/5011623/590790). Steven Jeuris vor 9 Jahren 3
Ich bevorzuge das Konzept, Dienstfunktionen in Erweiterungsmethoden zu speichern. @Steven - Ich hatte nie daran gedacht, meine Erweiterungsmethoden in einen System-Namespace zu setzen - +1 Jeff Fritz vor 9 Jahren 0
@StevenJeuris dieser Faden hat mir Krebs gebracht DLeh vor 6 Jahren 0
1
Steven Jeuris

Wie pdr hervorgehoben hat, ist es am besten zu verwenden String.Join, anstatt es selbst zu tun, wie ich es früher gesagt habe.

Vielleicht fehlt mir etwas, aber können Sie nicht einfach Folgendes tun?

private string ConcatenateCheckBoxListItems()
{
    StringBuilder sb = new StringBuilder();

    for ( int i = 0; i < MyList.Items.Count; ++i )
    {
        ListItem item = MyList.Items[ i ];
        sb.Append( item.Value );
        if ( i < MyList.Items.Count - 1 )
        {
            sb.Append( ", " );
        }
    }

    return sb.ToString();
}

AKTUALISIEREN:

Als Nebenbemerkung weiß ich, dass es bei Code wie diesem leicht ist, den Überblick über die Absicht zu verlieren. Deshalb habe ich an einem experimentellen Kurs gearbeitet, der Folgendes ermöglicht.

StringBuilder sb = new StringBuilder();
Loop loop = Loop.ForEach( MyList.Items, i => sb.Append( i.Value ) );
loop.After.AllButLast( () => sb.Append( ", " ) );
loop.Run();

Ich entscheide immer noch, ob mir diese Lösung gefällt oder nicht. :) Ich habe es nicht so oft benutzt.

Dies ist ähnlich zu dem anderen Ansatz, den ich ausprobiert habe. In diesem Fall unterscheidet sich die Anzahl der Elemente in MyList von der Anzahl der _selected_-Elemente, mit denen ich arbeiten möchte. Ansonsten würde ich nur die Werte der gesamten CheckBoxList wiederholen. Josh Earl vor 9 Jahren 0
@JoshEarl: Ich sehe keine Überprüfung in den anderen Beispielen, in denen die nicht ausgewählten Elemente ausgeschlossen sind, noch in Ihrem Beispiel. Steven Jeuris vor 9 Jahren 0
@Steven Leider wurde das Problem mit dem nicht ausgewählten Element im Hauptteil meiner Frage beschrieben, aber ich habe diesen Teil der Einfachheit halber nicht in meinen Code aufgenommen. Josh Earl vor 9 Jahren 0
@JoshEarl: kein Problem, aber du verstehst dann, dass die Anzahl der ausgewählten Elemente irrelevant ist? :) "Count" ist immer die Gesamtmenge der ausgewählten und nicht ausgewählten Elemente. Steven Jeuris vor 9 Jahren 0
@Steven Nun, es ist relevant, wenn Sie das "," nach dem zuletzt ausgewählten Element nicht einfügen möchten. Wenn Sie nur mit der Zählung durchlaufen und nicht wissen, wann Sie das letzte ausgewählte Element erreichen, erhalten Sie nach dem letzten Element ein ",", nein? Das war das Problem, das ich mit dem dummen Saitenbesatz ansprechen wollte. Josh Earl vor 9 Jahren 0
@JoshEarl: Ich verstehe es endlich. :) Beim Join können Sie dies tun, indem Sie die `where`-Klausel hinzufügen. Ich glaube, dass dies zu dem Ergebnis führen würde, als würden Sie die über der gefilterten Liste der ausgewählten Elemente anstelle der Gesamtliste ausführen. Steven Jeuris vor 9 Jahren 0