ForEach String concat

时间:2009-06-15 17:59:05

标签: c# string

一个小小的新手问题。我有一个foreach循环,我试图访问行对象的属性并分配给字符串。

foreach(row in Dataset)
{
 string finalName= row.name;

}

在每次迭代中,我需要将每一行的name属性连接到finalName

\非常感谢,

5 个答案:

答案 0 :(得分:25)

根据您的性能要求,您可以使用加法运算符进行连接:

string finalName = string.Empty;
foreach(row in Dataset)
{
    finalName += row.name;    
}

或使用StringBuilder

Stringbuilder sb = new StringBuilder();
foreach(row in Dataset)
{
    sb.Append(row.Name);   
}

string finalName = sb.ToString();

对于非常少量的追加,您不会注意到两个版本之间的差异。但是如果你要组合很多字符串,那么使用StringBuilder可能会有非常明显的性能和内存优势。

另外请记住,这会将琴弦一个接一个地直接放置,因此您可能还希望在每个琴弦之间添加一个空格或新行。


特别奖金LINQ单线:

因为你似乎是C#的新手,我建议你忽略这个,因为它非常先进,坦率地说不可读(但另一方面谁不喜欢将随机的LINQ投入他们的代码? )。不过,为了完整起见,我会在这里添加它。我不知道性能是什么,但与其他方法相比的一个主要优点是易于使用,您可以在字符串之间放置空格或其他字符。只需将标记行中的值更改为您要将组合字符串与(例如,Environment.NewLine或“”)分隔的任何值

string finalName = string.Join(
                "", //Change the value here to separate the strings.
                (from row in Dataset
                 select row.Name).ToArray());

或者,如果你更喜欢lambdas到LINQ:

string finalName = string.Join(
            "", //Change the value here to separate the strings.
            Dataset.Select(row => row.Name).ToArray());

答案 1 :(得分:3)

只是一些事情......

  1. DataSet没有行,他们有DataTable个,DataTableDataRows
  2. 您可以使用+=运算符来执行连接,但一般建议是StringBuilder对象因性能和内存原因而更适合这种情况。
  3. 假设您的DataSet有一个DataTable且您所关注的列名为name,您可以使用其中任何一个(第一个使用+=运算符,第二个使用StringBuilder

    string finalName = string.Empty;
    
    foreach(DataRow row in dataSet.Tables[0].Rows)
    {
        finalName += row["name"].ToString();
    }
    

    System.Text.StringBuilder builder = new System.Text.StringBuilder();
    
    foreach(DataRow row in dataSet.Tables[0].Rows)
    {
        builder.Append(row["name"].ToString());
    }
    
    string finalName = builder.ToString();
    

答案 2 :(得分:1)

如果你真的只想结束,那么这就是你所需要的......

string finalName = "";

foreach(DataRow row in dataset.Tables[tablename].Rows)
{
 finalName += row.name;

}

答案 3 :(得分:1)

这是一个......

string finalName = ""

foreach (DataRow row in dataSet.TableX)
{
   finalName += row.Name;
   finalName += Environment.NewLine;
}

这是另一个......

StringBuilder finalName = new StringBuilder()

foreach (DataRow row in dataSet.TableX)
{
    finalName.Append(row.Name);
    finalName.Append(Environment.NewLine);
}

答案 4 :(得分:0)

您可以将值添加到列表中,然后加入列表中的值

before_action :check_has_access, only: [:new]
...
protected

def check_has_access
  @place = Place.find(params[:q])
   if params[:q].blank? && @place.blank? || params[:t].blank? || @place.token != params[:t]
     redirect_to(root_path)
     flash[:alert] = 'Restricted sign-up'
   end
end