删除 StreamWriter.WriteLine c# 中最后一个马车 return 的最佳方法

Best way to remove the very last carriage return in StreamWriter.WriteLine c#

我有以下代码:

SqlDataReader Rdr = Cmd.ExecuteReader();
if (Rdr.HasRows)
{
   using (StreamWriter writer = new StreamWriter("c:\Test.txt"))
   {
      while (Rdr.Read())
      {
          writer.WriteLine(Rdr["Item1"].ToString() + Rdr["Item2"].ToString());
      }
   }                        
 }
 Rdr.Close(); 

WriteLine每次都加一个回车return,但我需要在到达最后一行时避免它。

我发现下面的代码知道 SqlDataReader 何时在最后一行,那时我可以将 WriteLine 更改为 Write,这不会添加回车 return :

if (reader.HasRows)
{
    var loop = true;
    while (loop)
    {
        //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0);
        loop = reader.Read();
        if (!loop)
        {
            //You are on the last record. Use values read in 1.
            //Do some exceptions
        }
        else {
            //You are not on the last record.
            //Process values read in 1., e.g. myvar
        }
    }
}

还有其他更好的方法吗?

我想您是在谈论评论 //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0);,并且您不想为所有单独的列创建中间变量。

这是非常可行的,因为本来就没有多大用处。您可以简单地使用 HasRows 属性 来查看在 您刚刚阅读上一行之后是否有内容要阅读 ,如果有,请写一个换行符。

while (reader.Read())
{
    // Build the line you want to write
    string lineToWrite = reader["Item1"].ToString() + reader["Item2"].ToString();   

    // Write the line without carriage return
    writer.Write(lineToWrite);

    if (reader.HasRows)
    {
        writer.WriteLine();
    }
}

您可以在为除第一行以外的所有行写新行之前写一个回车符return。您的代码应如下所示:

if(reader.Read())
{
    // write first line without carriage return in the beginning
}
while(reader.Read())
{
     //write a carriage return
     // ... and then write your line
}

可以通过简单的标志和单独的 Write / WriteLine:

来实现
bool first = true;
while (Rdr.Read())
{
    if (!first) writer.WriteLine();
    writer.Write(Rdr["Item1"].ToString() + Rdr["Item2"].ToString());
    first = false;
}

在这种情况下我喜欢这样做:

SqlDataReader Rdr = Cmd.ExecuteReader();
if (Rdr.HasRows)
{
   using (StreamWriter writer = new StreamWriter("c:\Test.txt"))
   {
      string eol = ""; 
      while (Rdr.Read())
      {
          writer.Write("{0}{1}{2}", eol, Rdr["Item1"], Rdr["Item2"]);
          eol = Environment.NewLine;
      }
   }                        
 }
 Rdr.Close();