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

C# 用于在C中追加集合的StringBuilder扩展方法#,c#,generics,lambda,stringbuilder,C#,Generics,Lambda,Stringbuilder,在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 h

在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();
var sb1=新的StringBuilder();
var sb2=新的StringBuilder();
var people=new List(){…init people here…};
var orders=new List(){…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也是如此。我不太确定如何编写代码使lambda与泛型一起工作。

这个方法应该返回什么?我可以看到一个字符串,但是为什么,如果您附加到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);
  public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items, Func<TItem, string> valueSelector)
  {
       foreach(TItem item in items)
       {  
            builder.Append(valueSelector(item));
       }
  }
公共静态字符串打印(此IEnumerable列,Func打印机)
{
var sb=新的StringBuilder();
foreach(T在col中)
{
sb.附录行(打印机(t));
}
使某人返回字符串();
}
字符串[]列={“Foo”,“Bar”};
字符串行=列打印(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)));
}
公共静态集合(此StringBuilder sb,
列表列(Func打印机)
{
col.ForEach(o=>sb.AppendLine(printer(o));
}
(与布鲁诺·康德说的相同)

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

使用
Func
委托

public static void AppendCollection<T>(this StringBuilder sb, 
                                       IEnumerable<T> collection, Func<T, string> method) {
   foreach(T x in collection) 
       sb.AppendLine(method(x));
}
公共静态集合(此StringBuilder sb,
IEnumerable集合,Func方法){
foreach(集合中的T x)
sb.附录(方法(x));
}

我不确定你是否需要努力工作:

 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();
列出人员=。。。
StringBuilder=新的StringBuilder();
建筑商。建筑商(人);
var s=builder.ToString();
当然,Person需要重写ToString()以生成Person对象的正确输出。

类似于:

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);
  public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items, Func<TItem, string> valueSelector)
  {
       foreach(TItem item in items)
       {  
            builder.Append(valueSelector(item));
       }
  }
public static void AppendCollection(此StringBuilder、IEnumerable items、Func valueSelector)
{
foreach(项目中的项目)
{  
builder.Append(值选择器(项));
}
}
我将添加一个有用的默认值,以在90%的情况下保存指定lambda

   public static void AppendCollection<TItem>(this StringBuilder builder, IEnumerable<TItem> items)
  {
      AppendCollection(builder, items, x=>x.ToString());
   }
publicstaticvoidappendcollection(此StringBuilder,IEnumerable项)
{
AppendCollection(生成器,items,x=>x.ToString());
}
静态类SBExtension
{
静态字符串集合(此StringBuilder sb,
IEnumerable coll,
(职能行动)
{
foreach(T在coll中)
{
某人追加(动作(t));
某人附加(“\n”);
}
使某人返回字符串();
}
}
但是,我认为让它返回StringBuilder会更好。这样你就可以把它链起来:

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

  }
静态StringBuilder AppendCollection(此StringBuilder sb,
IEnumerable coll,
(职能行动)
{
//同样的
归还某人;
}
字符串peopleAndOrders= sb.AppendCollection(people,p=>p.ToString()) .AppendCollection(orders,o=>o.ToString()).ToString()

我同意Jennifer关于违约案件的看法:

   public static StringBuilder AppendCollection<TItem>(
                  this StringBuilder builder, 
                  IEnumerable<TItem> items)
  {
      return AppendCollection(builder, items, x=>x.ToString());
   }
公共静态StringBuilder集合(
这个StringBuilder,
(可数项目)
{
返回AppendCollection(生成器,items,x=>x.ToString());
}
字符串peopleAndOrders= AppendCollection(人)。AppendCollection(命令)。ToString()

publicstaticvoidappendcollection(此StringBuilder、IEnumerable列表、Func-Func)
{
foreach(列表中的变量项)
{
建筑商。附录(职能(项目));
}
}
我不会返回字符串,我只会将其附加到传入的原始Stringbuilder中。

我的版本:

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

所以我被否决了,因为我要求澄清?这就是精神…我想重点是你的帖子不是一个答案,而是一个问题。我没有投你反对票。你可以通过在评论中要求澄清而不是回答来避免投反对票。我也没有投反对票。这就是我所做的,以避免人们认为任何不是答案的东西都是没有帮助的。但我不想这样。我打算在得到澄清后发布一个答案……该方法应该返回void,而不是像一开始那样返回字符串。它应该像AppendLine()一样运行,但允许您传递一个集合和格式化程序函数。StringBuilder上的方法应继续添加到内部缓冲区,直到在生成器上调用ToString为止。这结合了append/tostring步骤,与StringBuilder上的其他append方法不同。当然,我更新了答案,提到了我对此的看法,但问题中明确提出了这一点。我完全同意。我把那个示例代码打得有点太快了。我已经更新了这个问题。链接的东西很好,但我通常更喜欢我的扩展方法,它的工作方式基本上与类上的其他方法相同。更改其工作方式的基本模式使其更难理解。通过使用lambda,您可以对集合中的项目进行格式化
    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());