Stringerweiterungsmethode eine Sammlung in C # zum Anhängen

stimmen
5

In C #, versuche ich eine Erweiterungsmethode zu bauen für String AppendCollection () aufgerufen, die mich lassen würde dies tun:

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 mit einer Linie für jede Person in der Liste am Ende. Jede Zeile wäre das Ergebnis p.ToString (). Das gleiche gilt für stringOrders. Ich bin mir nicht ganz sicher, wie Sie den Code zu schreiben, um das lambdas Arbeit mit Generika zu machen.

Veröffentlicht am 09/12/2008 um 20:03
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
9

Verwenden Sie die Func<T,string>Delegierten.

public static void AppendCollection<T>(this StringBuilder sb, 
                                       IEnumerable<T> collection, Func<T, string> method) {
   foreach(T x in collection) 
       sb.AppendLine(method(x));
}
Beantwortet am 09/12/2008 um 20:08
quelle vom benutzer

stimmen
4
 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 eine Zeichenfolge nicht zurück, ich würde es nur anhängen zu der ursprünglichen String, die in übergeben wurde.

Beantwortet am 09/12/2008 um 20:14
quelle vom benutzer

stimmen
3

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 nicht eine Zeichenfolge in diesem Fall zurück. Ich würde es vorziehen, die folgenden:

    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 soll, wie:

        sb.AppendCollection(people, p => p.ToString());
        sb.AppendCollection(orders, o => o.ToString());
        Console.WriteLine(sb.ToString());
Beantwortet am 09/12/2008 um 20:29
quelle vom benutzer

stimmen
3

Etwas wie:

  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 in einem nützlichen Standard fügen Sie das Lambda in 90% der Fälle zu retten ... Einzelheiten enthalten

   public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
  {
      AppendCollection(builder, items, x=>x.ToString());
   }
Beantwortet am 09/12/2008 um 20:09
quelle vom benutzer

stimmen
3

Ich bin nicht sicher, was Sie brauchen, dass hart arbeiten:

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

Benutzt als

 List<Person> people = ...

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

Natürlich braucht Person ToString () zu überschreiben die korrekte Ausgabe für ein Person-Objekt zu erzeugen.

Beantwortet am 09/12/2008 um 20:09
quelle vom benutzer

stimmen
2
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();

  }
}

Aber ich denke, Sie besser dran sein werden, die es den String zurück. Auf diese Weise konnte man die Kette es:

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

  }

String peopleAndOrders = sb.AppendCollection (Menschen, p => p.ToString ()) .AppendCollection (Bestellungen, o => o.ToString ()) ToString ().

Und ich stimme mit Jennifer über Standardfall:

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

String peopleAndOrders = sb.AppendCollection (Personen) .AppendCollection (Aufträge) .ToString ();

Beantwortet am 09/12/2008 um 20:11
quelle vom benutzer

stimmen
2

Was ist diese Methode zurück annehmen? Ich kann einen String sehen, aber warum, wenn Sie zu einem String anhängen?

Was Sie versuchen zu tun ist ziemlich einfach, aber Sie müssen genau erklären, was Sie wollen.

Aktualisieren:

Hier ist mein nehmen. eine Erweiterungsmethode für diese verwendet, ist dumm und sinnlos, wenn man nur in einem neuen String und gibt eine Zeichenfolge übergeben werden.

Update 2:

Nun, da ich, dass die Nutzung zu sehen, was Sie tun, ist eine schlechte Praxis. Was Sie sollten im Idealfall tun ist so 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 mehr Klarstellung:

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

(Die die gleiche ist wie Bruno conde gesagt)

Und jetzt brauchen Sie nicht, es ist wirklich mehr :)

Beantwortet am 09/12/2008 um 20:07
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more