代码之家  ›  专栏  ›  技术社区  ›  Lance Fisher

用于在C中追加集合的StringBuilder扩展方法#

  •  5
  • Lance Fisher  · 技术社区  · 16 年前

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

    7 回复  |  直到 16 年前
        1
  •  11
  •   Mehrdad Afshari    16 年前

    使用 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));
    }
    
        2
  •  5
  •   BFree    16 年前
     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中。

        3
  •  3
  •   tvanfosson    16 年前

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

    当然,Person需要重写ToString()以生成Person对象的正确输出。

        4
  •  3
  •   Jennifer    16 年前

      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%的情况下保存指定lambda。。。

       public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
      {
          AppendCollection(builder, items, x=>x.ToString());
       }
    
        5
  •  3
  •   bruno conde    16 年前

    我的版本:

        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());
    
        6
  •  2
  •   James Curran    16 年前
    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;
    
      }
    

    弦乐演奏者= sb.AppendCollection(people,p=>p.ToString())

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

    弦乐演奏者=

        7
  •  2
  •   leppie    16 年前

    这个方法应该返回什么?我可以看到一个字符串,但是为什么,如果您附加到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)));
    }
    

    (与布鲁诺·康德说的相同)

    现在你真的不再需要它了:)