C#中if / else的条件不符合预期

时间:2018-03-25 16:49:00

标签: c# asp.net csv validation if-statement

我在用C#编写的if / else语句中遇到奇怪的行为。我是C#的新手,也是使用Visual Studio Pro 2017的ASP.NET的新手。

我正在努力为网络应用添加功能,以便通过用户每this article by Mudassar Khan

上传.CSV来上传SQL数据到表格

一切都很好用。我现在正在努力在上传之前验证数据。我在上面的文章中使用相同的.CSV但是有一些"错误"条件介绍。

1,John,Hammond,United States
2,Shouldbreak,India
3,JohnMathews,Ireland
4,Robert,Schidner,Russia,sdfsdfdf,sdfsdfsdf,

在下面的代码中,您将看到我正在测试以确保每行中的列数正确,方法是在变量中设置所需的列数,并将其与每行中的逗号数进行比较在.CSV。

我希望的验证如下:

  1. 如果有正确数量的列添加到dataTable。
  2. 如果没有正确数量的列。
    1. 显示包含错误消息的ASP控件。
    2. 如果列太多了。
      1. 在错误消息中添加一个字符串,其中包含行号和错误的列数。
    3. 如果列太少。
      1. 在错误消息变量中添加一个字符串,其中包含行号和错误的列数。
  3. 我还在一个单独的ASP控件中跟踪并显示每行中找到的逗号数,以便进行调试。

    以下是我的代码隐藏文件中的代码:

    //Upload and save the file
    string csvPath = Server.MapPath("~/_uploadedDataCSV/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
    FileUpload1.SaveAs(csvPath);
    
    DataTable dt = new DataTable();
    
    int columnCount = 4; // Expected number of columns
    int commas = 0; // Set comma count to 0;
    int tableRow = 0; // set current table row to 0;
    Count.Text = string.Empty;
    string errMessage = string.Empty;
    
    dt.Columns.AddRange(new DataColumn[4] // Add expected number of columns to table
    {
        // Add column Header and expected (c#)datatype 
        new DataColumn("Id", typeof(int)),
        new DataColumn("First Name", typeof(string)),
        new DataColumn("Last Name", typeof(string)),
        new DataColumn("Country",typeof(string))
    });
    
    string csvData = File.ReadAllText(csvPath); // Creates String of all content in CSV file
    foreach (string row in csvData.Split('\n')) // Do the following for each row in the file
    {
        // Start Validation Logic
        // - - - - - - - - - - - - - - - - - - - -
    
        tableRow++;
    
        // Count commas in row
        foreach (char ch in row)
        {
            if (ch.Equals(','))
            {
                commas++;
            }
        }
    
        if (!string.IsNullOrEmpty(row)) // if the row is not empty
        {
            if (commas == columnCount) // if commas in row equals the number of columns expected
            {
                dt.Rows.Add();
                int i = 0;
                foreach (string cell in row.Split(','))
                {
                    dt.Rows[dt.Rows.Count - 1][i] = cell;
                    i++;
                }
            }
            //Begin error reporting for row
            // - - - - - - - - - - - - - - - - - - - -
            else if (commas != columnCount)
            {
                err.Visible = true; // show error message element
                err.Text = errMessage; // set text of error message element to value of errMessage variable
                if (commas >= columnCount) // if too many columns in row
                {
                    errMessage+= $"Row {tableRow} has too many columns <br />";
                }
                else if (commas < columnCount) // if not enough columns in row
                {
                    errMessage+= $"Row {tableRow} does not have enough columns <br />";
                }
            }
        }
    
        Count.Text+= commas.ToString() + "|";
        commas = 0;
    }
    

    我遇到的问题是当一行中有太多列时,我没有收到与此情况相关的错误消息。调试控制器正确显示逗号的数量,如果太少,则正确显示消息,而不是消息太多。当我在调试器中单步调试代码时,会报告所有行的变量(逗号/ columnCount)已更正。

    有什么建议吗?如果我遗漏了任何内容,我很乐意提供更多信息。

    我尝试删除列太少的情况,但仍然没有显示太多列的消息。我也尝试颠倒检查的顺序,但给出了相同的输出。我已尝试按this discussion进行重建。

1 个答案:

答案 0 :(得分:1)

所有学分应该归@Mike McCaughan所有,他的评论绝对到位。我只是想举一个迈克所说的例子:

string a = string.Empty;
string b = a;
a += "3";
Console.WriteLine(b); //result in empty string in console

回到你的问题:

string errMessage = string.Empty;
err.Text = errMessage;
errMessage+= $"Row {tableRow} has too many columns <br />";
Console.WriteLine(err.Text); //result in empty string in console

它发生的原因是因为c#中字符串的不可变性。表示对字符串对象的任何更改都将导致创建新对象。您可以在那里找到更多信息:Immutability of String Objects