6 Stimmen

StringBuilder Erweiterungsmethode zum Anhängen einer Sammlung in C#

In C# versuche ich, eine Erweiterungsmethode für StringBuilder namens AppendCollection() zu erstellen, mit der ich dies tun könnte:

var sb1 = new StringBuilder();
var sb2 = new StringBuilder();
var people = new List<Person>() { ...init people here... };
var orders = new List<Orders>() { ...init orders here... };

sb1.AppendCollection(people, p => p.ToString());
sb2.AppendCollection(orders, o => o.ToString());

string stringPeople = sb1.ToString();
string stringOrders = sb2.ToString();

stringPeople würde am Ende eine Zeile für jede Person in der Liste enthalten. Jede Zeile wäre das Ergebnis von p.ToString(). Das Gleiche gilt für stringOrders. Ich bin mir nicht ganz sicher, wie ich den Code schreiben muss, damit die Lambdas mit Generics funktionieren.

11voto

mmx Punkte 400975

Verwenden Sie die Func<T,string> delegieren.

public static void AppendCollection<T>(this StringBuilder sb, 
                                       IEnumerable<T> collection, Func<T, string> method) {
   foreach(T x in collection) 
       sb.AppendLine(method(x));
}

5voto

BFree Punkte 100035
 public static void AppendCollection<T>(this StringBuilder builder, IEnumerable<T> list, Func<T,string> func)
        {
            foreach (var item in list)
            {
                builder.AppendLine(func(item));
            }
        }

Ich würde keine Zeichenkette zurückgeben, ich würde sie nur an den ursprünglichen Stringbuilder anhängen, der übergeben wurde.

3voto

tvanfosson Punkte 506878

Ich bin mir nicht sicher, ob Sie so hart arbeiten müssen:

 public static void AppendCollection( this StringBuilder builder,
                                      ICollection collection )
 {
     foreach (var item in collection)
     {
        builder.AppendLine( Convert.ToString( item ) );
     }
 }

Verwendet als

 List<Person> people = ...

 StringBuilder builder = new StringBuilder();
 builder.AppendCollection( people );
 var s = builder.ToString();

Natürlich muss Person die Funktion ToString() überschreiben, um die richtige Ausgabe für ein Person-Objekt zu erzeugen.

3voto

Jennifer Punkte 5048

Etwa so:

  public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items, Func<TItem, string> valueSelector)
  {
       foreach(TItem item in items)
       {  
            builder.Append(valueSelector(item));
       }
  }

Ich würde einen nützlichen Standard hinzufügen, um die Angabe des Lambdas in 90% der Fälle zu vermeiden...

   public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
  {
      AppendCollection(builder, items, x=>x.ToString());
   }

3voto

bruno conde Punkte 47059

Meine Version:

    public static string AppendCollection<T>(this StringBuilder sb, IEnumerable<T> enumerable, Func<T, string> method)
    {
        List<T> l = new List<T>(enumerable);
        l.ForEach(item => sb.AppendLine(method(item)));
        return sb.ToString();
    }

aber Sie sollten in diesem Fall keine Zeichenkette zurückgeben. Ich würde das Folgende bevorzugen:

    public static void AppendCollection<T>(this StringBuilder sb, IEnumerable<T> enumerable, Func<T, string> method)
    {
        List<T> l = new List<T>(enumerable);
        l.ForEach(item => sb.AppendLine(method(item)));
    }

verwendet werden:

        sb.AppendCollection(people, p => p.ToString());
        sb.AppendCollection(orders, o => o.ToString());
        Console.WriteLine(sb.ToString());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X