StringBuilder μέθοδο επέκτασης για την προσάρτηση μιας συλλογής σε C #

ψήφοι
5

Στην C #, Προσπαθώ να οικοδομήσουμε μια μέθοδο επέκτασης για StringBuilder ονομάζεται AppendCollection () που θα επιτρέψτε μου να το κάνετε αυτό:

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 θα καταλήξετε με μια γραμμή για κάθε άτομο στη λίστα. Κάθε γραμμή θα ήταν το αποτέλεσμα της p.ToString (). Ομοίως για stringOrders. Δεν είμαι βέβαιος πώς να γράψει τον κώδικα για να κάνει τη δουλειά λάμδα με τα γενόσημα φάρμακα.

Δημοσιεύθηκε 09/12/2008 στις 20:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
9

Χρησιμοποιήστε το Func<T,string>πληρεξούσιο.

public static void AppendCollection<T>(this StringBuilder sb, 
                                       IEnumerable<T> collection, Func<T, string> method) {
   foreach(T x in collection) 
       sb.AppendLine(method(x));
}
Απαντήθηκε 09/12/2008 στις 20:08
πηγή χρήστη

ψήφοι
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));
            }
        }

Δεν θα επιστρέψει ένα string, θα ήθελα να το προσαρτήσει μόνο στην αρχική StringBuilder που ψηφίστηκε το.

Απαντήθηκε 09/12/2008 στις 20:14
πηγή χρήστη

ψήφοι
3

έκδοση μου:

    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();
    }

αλλά δεν πρέπει να επιστρέψει ένα string σε αυτή την περίπτωση. Θα προτιμούσα τα εξής:

    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)));
    }

που πρέπει να χρησιμοποιούνται, όπως:

        sb.AppendCollection(people, p => p.ToString());
        sb.AppendCollection(orders, o => o.ToString());
        Console.WriteLine(sb.ToString());
Απαντήθηκε 09/12/2008 στις 20:29
πηγή χρήστη

ψήφοι
3

Κάτι όπως:

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

Θα ήθελα να προσθέσω σε ένα χρήσιμο προεπιλογή για να σώσει και καθορίζει το λάμδα στο 90% των περιπτώσεων ...

   public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
  {
      AppendCollection(builder, items, x=>x.ToString());
   }
Απαντήθηκε 09/12/2008 στις 20:09
πηγή χρήστη

ψήφοι
3

Δεν είμαι σίγουρος ότι πρέπει να εργαστούμε σκληρά ώστε:

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

Που χρησιμοποιείται ως

 List<Person> people = ...

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

Φυσικά, πρόσωπο πρέπει να παρακάμψουν toString () για να παραχθεί το σωστό εξόδου για ένα αντικείμενο Person.

Απαντήθηκε 09/12/2008 στις 20:09
πηγή χρήστη

ψήφοι
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();

  }
}

Ωστόσο, νομίζω ότι θα είναι σε καλύτερη θέση που έχει να επιστρέψει το StringBuilder. Με αυτόν τον τρόπο θα μπορούσατε να το συνδέετε:

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

  }

peopleAndOrders εγχόρδων = sb.AppendCollection (άνθρωποι, p => p.ToString ()) .AppendCollection (παραγγελίες, o => o.ToString ()) toString ().?

Και συμφωνώ με την Τζένιφερ για την περίπτωση αθέτησης:

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

peopleAndOrders εγχόρδων = sb.AppendCollection (οι άνθρωποι) .AppendCollection (εντολές) .ToString ()?

Απαντήθηκε 09/12/2008 στις 20:11
πηγή χρήστη

ψήφοι
2

Τι είναι αυτή η μέθοδος υποθέτει να επιστρέψει; Μπορώ να δω μια σειρά, αλλά γιατί, αν προσαρτώντας σε StringBuilder;

Αυτό που προσπαθούμε να κάνουμε είναι μάλλον εύκολο, αλλά θα πρέπει να εξηγήσω ακριβώς τι θέλετε.

Εκσυγχρονίζω:

Εδώ είναι η γνώμη μου. Χρησιμοποιώντας μια μέθοδο επέκτασης για αυτό είναι ανόητο και άσκοπο αν πρόκειται ακριβώς για να περάσει σε μια νέα StringBuilder και να επιστρέψει ένα string.

Ενημέρωση 2:

Τώρα που βλέπω ότι η χρήση, αυτό που κάνετε είναι κακή πρακτική. Τι θα πρέπει ιδανικά να κάνουμε είναι κάτι σαν:

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);

Ενημέρωση 3:

Μετά περισσότερες διευκρινίσεις:

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

(Το οποίο είναι το ίδιο όπως είπε Bruno Conde)

Και τώρα εσείς dont πραγματικά το χρειάζεστε πια :)

Απαντήθηκε 09/12/2008 στις 20:07
πηγή χρήστη

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