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.

2voto

leppie Punkte 111830

Was soll diese Methode zurückgeben? Ich kann einen String sehen, aber warum, wenn Sie an einen StringBuilder anhängen?

Was Sie vorhaben, ist recht einfach, aber Sie müssen genau erklären, was Sie wollen.

Aktualisierung:

Hier ist meine Meinung dazu. Mit einer Erweiterung Methode für diese ist dumm und sinnlos, wenn Sie nur gehen, um in einem neuen StringBuilder übergeben und eine Zeichenfolge zurückgeben.

Update 2:

Jetzt, wo ich diese Verwendung sehe, ist das, was Sie tun, eine schlechte Praxis. Was Sie idealerweise tun sollten, ist etwas wie:

public static string Print<T>(this IEnumerable<T> col, Func<T,string> printer)
{
  var sb = new StringBuilder();
  foreach (T t in col)
  {
    sb.AppendLine(printer(t));
  }
  return sb.ToString();
}

string[] col = { "Foo" , "Bar" };
string lines = col.Print( s => s);

Update 3:

Nach weiterer Klärung:

public static void AppendCollection<T>(this StringBuilder sb, 
   List<T> col, Func<T,string> printer)
{
  col.ForEach( o => sb.AppendLine(printer(o)));
}

(was dasselbe ist, was Bruno Conde sagte)

Und jetzt brauchen Sie es eigentlich nicht mehr :)

2voto

James Curran Punkte 98228
static class SBExtention
{
  static string AppendCollection<T>(this StringBuilder sb, 
                                    IEnumerable<T> coll, 
                                    Func<T,string> action)
  {
       foreach(T t in coll)
       {
          sb.Append(action(t));
          sb.Append("\n");
       }
       return sb.ToString();

  }
}

Ich denke jedoch, dass Sie besser dran sind, wenn es den StringBuilder zurückgibt. Auf diese Weise können Sie es verketten:

  static StringBuilder AppendCollection<T>(this StringBuilder sb, 
                                    IEnumerable<T> coll, 
                                    Func<T,string> action)
  {
       // same
       return sb;

  }

string peopleAndOrders = sb.AppendCollection(people, p => p.ToString()) .AppendCollection(orders, o => o.ToString()).ToString();

Und ich stimme Jennifer zu, was den Standardfall betrifft:

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

string peopleAndOrders = sb.AppendCollection(people).AppendCollection(orders).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