Метод расширения StringBuilder для добавления набора в C#

вам нужно использовать .each() для циклического перемещения по столбцам

$('.column').each(function(){
  console.log($(this).find('.item').length);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="column">
  <ul class="list">
    <li class="item">item 1</li>
    <li class="item">item 2</li>
    <li class="item">item 3</li>
  </ul>
</div>
<div class="column">
  <ul class="list">
    <li class="item">item 4</li>
    <li class="item">item 5</li>
  </ul>
</div>
<div class="column">
  <ul class="list">
    <li class="item">item 6</li>
  </ul>
</div>

5
задан Lance Fisher 9 December 2008 в 19:36
поделиться

7 ответов

Используйте 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));
}
10
ответ дан 18 December 2019 в 05:56
поделиться
 public static void AppendCollection<T>(this StringBuilder builder, IEnumerable<T> list, Func<T,string> func)
        {
            foreach (var item in list)
            {
                builder.AppendLine(func(item));
            }
        }

Я не возвратил бы строку, я просто добавлю ее к исходному Stringbuilder, который был передан в.

5
ответ дан 18 December 2019 в 05:56
поделиться

Я не уверен, что необходимо работать что трудно:

 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 () для создания корректного вывода для объекта Человека.

3
ответ дан 18 December 2019 в 05:56
поделиться

Что-то как:

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

Я добавил бы в полезном значении по умолчанию для сохранения specifiying лямбда в 90% случаев...

   public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
  {
      AppendCollection(builder, items, x=>x.ToString());
   }
3
ответ дан 18 December 2019 в 05:56
поделиться

Моя версия:

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

но Вы не должны возвращать строку в этом случае. Я предпочел бы следующее:

    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());
3
ответ дан 18 December 2019 в 05:56
поделиться
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 в виде строки = сурьма. AppendCollection (люди, p => p. ToString ()).AppendCollection (заказы, o => o. ToString ()).ToString ();

И я соглашаюсь с Jennifer о случае по умолчанию:

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

представьте peopleAndOrders в виде строки = сурьма. AppendCollection (люди).AppendCollection (заказы).ToString ();

2
ответ дан 18 December 2019 в 05:56
поделиться

Каков этот метод, предполагают для возврата? Я вижу строку, но почему, если Вы добавляете к StringBuilder?

То, что Вы пытаетесь сделать, довольно легко, но необходимо объяснить точно, что Вы хотите.

Обновление:

Вот мое взятие. Используя дополнительный метод для этого глупо и бессмыслен, если Вы просто собираетесь передать в новом StringBuilder и возвратить строку.

Обновление 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 конусовидный, сказал),

И теперь Вам действительно больше не нужен он :)

2
ответ дан 18 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: