C# 在循环中创建的分隔字符串

C# 在循环中创建的分隔字符串,c#,.net,sql,loops,C#,.net,Sql,Loops,我正在寻找创建循环中与另一个字符串分隔的字符串的最佳方法。我的意思是,例如,SQL reader: StringBuilder sb = new StringBuilder(); while(reader.Read()) { sb.Append(reader[0]); sb.Append("<br />"); } string result = sb.ToString(); result = result.Remove(result.LastIndexOf("<br /

我正在寻找创建循环中与另一个字符串分隔的字符串的最佳方法。我的意思是,例如,SQL reader:

StringBuilder sb = new StringBuilder();
while(reader.Read())
{
  sb.Append(reader[0]);
  sb.Append("<br />");
}
string result = sb.ToString();
result = result.Remove(result.LastIndexOf("<br />")); // <-
StringBuilder sb=新建StringBuilder();
while(reader.Read())
{
sb.Append(reader[0]);
sb.追加(“
”); } 字符串结果=sb.ToString(); result=result.Remove(result.LastIndexOf(“
”);// 关于:

StringBuilder builder;
while (reader.Read())
{
    if( builder == null )
    {
        builder = new StringBuilder(reader[0]);
    }
    else
    {
        builder.Append("<br />");
        builder.Append(reader[0]);
    }
}
string result = builder.ToString();
StringBuilder;
while(reader.Read())
{
if(builder==null)
{
生成器=新的StringBuilder(读取器[0]);
}
其他的
{
builder.Append(“
”); builder.Append(读取器[0]); } } 字符串结果=builder.ToString();
关于:

StringBuilder builder;
while (reader.Read())
{
    if( builder == null )
    {
        builder = new StringBuilder(reader[0]);
    }
    else
    {
        builder.Append("<br />");
        builder.Append(reader[0]);
    }
}
string result = builder.ToString();
StringBuilder;
while(reader.Read())
{
if(builder==null)
{
生成器=新的StringBuilder(读取器[0]);
}
其他的
{
builder.Append(“
”); builder.Append(读取器[0]); } } 字符串结果=builder.ToString();
我不是StringBuilder的粉丝,除非您真的知道需要担心性能。它会产生难看的代码。我会这样写

private IEnumerable<string> ReadAllStrings(DataReader reader)
{
    while(reader.Read())
        yield return reader[0];
}


String.Join("<br />", ReadAllStrings(reader).ToArray());
private IEnumerable ReadAllString(DataReader)
{
while(reader.Read())
产生返回读取器[0];
}
Join(“
”,ReadAllStrings(reader.ToArray());
如果我做了很多,我可能会考虑一个扩展方法:

public static class Extensions
{
    public static string JoinWith(this IEnumerable<string> strings, string separator)
    {
        return String.Join(separator, strings.ToArray());
    }
}
公共静态类扩展
{
公共静态字符串JoinWith(此IEnumerable字符串,字符串分隔符)
{
返回String.Join(分隔符,strings.ToArray());
}
}
然后,我的代码如下所示:

ReadAllStrings(reader).JoinWith("<br />");
string result = reader.JoinStrings(0, "<br/>");
ReadAllStrings(reader).JoinWith(
);
我不是StringBuilder的粉丝,除非您真的知道需要担心性能。它会产生难看的代码。我会这样写

private IEnumerable<string> ReadAllStrings(DataReader reader)
{
    while(reader.Read())
        yield return reader[0];
}


String.Join("<br />", ReadAllStrings(reader).ToArray());
private IEnumerable ReadAllString(DataReader)
{
while(reader.Read())
产生返回读取器[0];
}
Join(“
”,ReadAllStrings(reader.ToArray());
如果我做了很多,我可能会考虑一个扩展方法:

public static class Extensions
{
    public static string JoinWith(this IEnumerable<string> strings, string separator)
    {
        return String.Join(separator, strings.ToArray());
    }
}
公共静态类扩展
{
公共静态字符串JoinWith(此IEnumerable字符串,字符串分隔符)
{
返回String.Join(分隔符,strings.ToArray());
}
}
然后,我的代码如下所示:

ReadAllStrings(reader).JoinWith("<br />");
string result = reader.JoinStrings(0, "<br/>");
ReadAllStrings(reader).JoinWith(
);
这只是以下几个更好想法的组合:

public static class Extensions
{

    public static string JoinStrings(this DataReader reader, int ColumnIndex, string delimiter)
    {
        var result = new StringBuidler();
        var delim = String.Empty;
        while (reader.Read())
        {
           result.Append(delim).Append(reader[ColumnIndex].ToString());
           delim = delimiter;
        }
        return result.ToString();
    }
}
现在你所要做的就是这样称呼它:

ReadAllStrings(reader).JoinWith("<br />");
string result = reader.JoinStrings(0, "<br/>");
string result=reader.JoinStrings(0,
);
这只是以下几个更好想法的组合:

public static class Extensions
{

    public static string JoinStrings(this DataReader reader, int ColumnIndex, string delimiter)
    {
        var result = new StringBuidler();
        var delim = String.Empty;
        while (reader.Read())
        {
           result.Append(delim).Append(reader[ColumnIndex].ToString());
           delim = delimiter;
        }
        return result.ToString();
    }
}
现在你所要做的就是这样称呼它:

ReadAllStrings(reader).JoinWith("<br />");
string result = reader.JoinStrings(0, "<br/>");
string result=reader.JoinStrings(0,
);
另一个.Net 2.0解决方案-更改顺序:

reader.Read();
StringBuilder sb = new StringBuilder(reader[0]);
while(reader.Read())
{
  sb.Append("<br />");
  sb.Append(reader[0]);
}
string result = sb.ToString();
reader.Read();
StringBuilder sb=新的StringBuilder(读取器[0]);
while(reader.Read())
{
sb.追加(“
”); sb.Append(reader[0]); } 字符串结果=sb.ToString();
另一个.Net 2.0解决方案-更改顺序:

reader.Read();
StringBuilder sb = new StringBuilder(reader[0]);
while(reader.Read())
{
  sb.Append("<br />");
  sb.Append(reader[0]);
}
string result = sb.ToString();
reader.Read();
StringBuilder sb=新的StringBuilder(读取器[0]);
while(reader.Read())
{
sb.追加(“
”); sb.Append(reader[0]); } 字符串结果=sb.ToString();
公共类分隔符
{
私有字符串sep;
private bool first=true;
公共分隔符(字符串sep)
{
this.sep=sep;
}
公共虚拟字符串ToString()
{
字符串回复=第一个?“:sep;
第一个=假;
回复;
}
}
var sep=新的分隔符(“
”); var builder=新的StringBuilder(); while(reader.Read()) { Append(sep.ToString()); builder.Append(读取器[0]); }
公共类分隔符
{
私有字符串sep;
private bool first=true;
公共分隔符(字符串sep)
{
this.sep=sep;
}
公共虚拟字符串ToString()
{
字符串回复=第一个?“:sep;
第一个=假;
回复;
}
}
var sep=新的分隔符(“
”); var builder=新的StringBuilder(); while(reader.Read()) { Append(sep.ToString()); builder.Append(读取器[0]); }
他正在寻找通过将字符串组件添加到一起来创建字符串的最佳方法。好的,现在您的问题已被编辑,因此答案没有多大意义。:)但看到在同一行中使用StringBuilder和String.Concat,我的眼睛还是很痛。。这也没什么意义。:)谢谢你的小费!我已经编辑了。他正在寻找通过将字符串组件直接添加到一起来创建字符串的最佳方法。好的,现在您的问题已经编辑,所以答案没有多大意义。:)但看到在同一行中使用StringBuilder和String.Concat,我的眼睛还是很痛。。这也没什么意义。:)谢谢你的小费!我已经同意了,Join在内部将所有字符串复制到同一个缓冲区,而不进行新的分配。所以您使用的是同一个字符串。Join(String,IEnumerable.ToArray())也是--我认为这是最好的方法,不是吗?是的,我认为这是最好的方法。但在您的示例中,您正在创建集合的两个副本。一个用于列表,一个用于ToArray()。在我的方法中,您只创建一个数组。我更喜欢扩展方法。在我工作的代码中添加了两个非常类似的扩展方法。让事情变得简单易懂…嗯。。我以为ToArray()只是创建了一个数组,然后将其传递给String.Join。uou是说这个数组是第二个副本吗?我还不知道如何使用“收益”语句。我必须学习,我会的。我同意,Join在内部将所有字符串复制到同一个缓冲区,而不进行新的分配。因此您使用的是同一个字符串。Join(String,IEnumerable.ToArray())也是--我认为这是最好的方法,不是吗?是的,我认为这是最好的方法。但在您的示例中,您正在创建集合的两个副本。一个用于列表,一个用于ToArray()。在我的方法中,您只创建一个数组。我更喜欢扩展方法。添加了一些非常相似的内容