c#foreach循环写得不好

Sco*_*lby 2 c# asp.net sqlcommand

这个foreach循环在测试时运行良好,只返回5行数据,但我很清楚它是如何编写的,有没有更好的方法,可能使用stringbuilder来更有效地重写它?

               SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connstring"].ConnectionString);
    SqlCommand comm = new SqlCommand("SELECT Title, StartDate FROM tblEvents JOIN eo_UserEventWatch ON eo_UserEventWatch.EventID=tblEvents.ID WHERE eo_UserEventWatch.UserID = @GUID ;", conn);
    comm.Parameters.AddWithValue("GUID", userID);
    conn.Open();
    SqlDataAdapter da = new SqlDataAdapter(comm);
    DataTable dt = new DataTable();
    da.Fill(dt);
    string result ="{ \"event\" :[";
    foreach (DataRow dr in dt.Rows)
    {
        result += "{\"title\" : \"" + dr[0].ToString() + "\" , \"start\" : \"" + dr[1].ToString() +"\"} ,";
    }
    result = result.TrimEnd(',');
    result += "] }";
    return result;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

是的,使用它会更有效StringBuilder:

StringBuilder builder = new StringBuilder("{ \"event\" :[");
foreach (DataRow row in dt.Rows)
{
    // Alternatively, use AppendFormat
    builder.Append("{\"title\" :\"");
           .Append(row[0])
           .Append("\", \"start\" : \"")
           .Append(row[1])
           .Append("\"} ,");
}
if (builder[builder.Length - 1] == ',')
{
    builder.Length -= 1;
}
builder.Append("] }");
string result = builder.ToString();
Run Code Online (Sandbox Code Playgroud)

但是,它仍然不是很好的代码 - 因为你已经拥有了所有可怕的文字JSON.我建议使用Json.NET或其他JSON库.你可以在那时使用LINQ,例如

var result = new { event = dt.AsEnumerable()
                             .Select(r => new { 
                                 title = r.Field<string>(0),
                                 start = r.Field<DateTime>(1))
                             .ToArray() };
// Or whatever, depending on the library you use
var json = JsonSerializer.ToJson(result);
Run Code Online (Sandbox Code Playgroud)

除此之外,现在您不必担心起始值的格式,或者标题是否包含引号等.

(编辑:如上所述,你应该绝对有usingSQL连接的声明等.这不在问题的主要部分,这就是为什么我在这里没有提到它.)