c#if else无法正常工作

时间:2017-09-01 21:21:08

标签: c# if-statement

方法DeleteTester应从TestingCompany.txt中删除选定测试人员的行 如果测试仪已经分配到设备测试仪,则不应删除。

我的代码无法正常运行。将测试仪分配给设备时,会显示错误消息“此测试公司已分配给设备”并删除测试仪。不应删除测试程序。

public void DeleteTester(string testerData)
{
    string line_to_delete = testerData;
    string[] line_to_Delete_Array= theEntity.setString(line_to_delete);
    string testerToDelete = line_to_Delete_Array[0];
    foreach (var line in File.ReadLines(@"C:\\Temp\\Equipment.txt"))
        if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase))
        {
            MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else 
        {
            string strFilePath = @"C:\\Temp\\TestingCompany.txt";
            string strSearchText = testerData;
            string strOldText;
            string n = "";
            StreamReader sr = File.OpenText(strFilePath);
            while ((strOldText = sr.ReadLine()) != null)
            {
                if (!strOldText.Contains(strSearchText))
                {
                    n += strOldText + Environment.NewLine;
                }
            }
            sr.Close();
            File.WriteAllText(strFilePath, n);
        }
}

方法setString从文件

中的行返回数组
public string[] setString(string newString)
        {
            sString = newString;
            setStrings = sString.Split(',');
            return setStrings;
        }

设备文件包含分隔符“,”

的信息
1,voltmeter,25/07/2017,1
2,multimeter,31/08/2017,2
3,ampermeter,31/07/2016,3
4,voltmeter,29/08/2016,1

测试公司文件数据

1,Testing Ltd,2 New North Rd,Auckland,2678
2,Q Testing Ltd, 4 Dominion Street,Auckland,5678
3,Metrology Limited,2 Dominos St,Christchurch,3456

DeleteTester()

private void btnDeleteTester_Click(object sender, EventArgs e)
        {
            string deleteTester = lstTestingCompanies.GetItemText(lstTestingCompanies.SelectedItem);
            theController.DeleteTester(deleteTester);
}

deleteTester有一个数据1,Testing Ltd,2 New North Rd,Auckland,2678

固定代码它有效,但它只是一种模式而且设计不合理

public void DeleteTester(string testerData)
        {
            string line_to_delete = testerData;
            string[] line_to_Delete_Array = theEntity.setString(line_to_delete);
            string testerToDelete = line_to_Delete_Array[0];

            string[] checkEquipment = File.ReadAllLines(@"C:\\Temp\\Equipment.txt");

            foreach (string s in checkEquipment)
            {
                string[] TesterToDelete = theEntity.setString(s);

                if (Convert.ToInt32(TesterToDelete[3]) == Convert.ToInt32(testerToDelete))
                {
                    MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    flag = 1;
                    break;
                }
            }
            if (flag != 1)
            {
                string strSearchText = testerData;
                string strOldText;
                string n = "";
                StreamReader sr = File.OpenText(@"C:\\Temp\\TestingCompany.txt");
                while ((strOldText = sr.ReadLine()) != null)
                {
                    if (!strOldText.Contains(strSearchText))
                    {
                        n += strOldText + Environment.NewLine;
                    }
                }
                sr.Close();
                File.WriteAllText(@"C:\\Temp\\TestingCompany.txt", n);
            }

        }

1 个答案:

答案 0 :(得分:2)

以下是您的代码的固定版本,可以完成预期的工作。也就是说,如果传递的第一个字符串数未分配给设备文件中的任何设备,它将从公司文件中删除该行。

我删除了一堆冗余代码并将其清理干净。 首先,在打开文件时执行大量其他操作不是一个好习惯。相反,阅读内容,关闭文件,然后执行您的工作,如果需要将其写回文件,请再次打开并写入。除非你有充分的理由不这样做。

public static void DeleteTester(string testerData)
{
    string[] line_to_Delete_Array = testerData.Split(',');
    string testerToDelete = line_to_Delete_Array[0];
    string equipmentFile = @"C:\Temp\Equipment.txt";
    string companyFile = @"C:\Temp\TestingCompany.txt";

    var equipmentData = File.ReadLines(equipmentFile);
    var companyData = File.ReadLines(companyFile);

    foreach (var line in equipmentData)
    {
        if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase))
        {
            Console.WriteLine("This testing company is assigned to Equipment");
            break;
        }
        else
        {
            var finalList = new List<string>();
            foreach(var company in companyData)
            {
                if (!company.Contains(testerData))
                    finalList.Add(company);
            }
            File.WriteAllLines(companyFile, finalList.ToArray());
            break;
        }
    }
}

P.S。 您得到此测试公司已分配到设备消息,因为您传递的测试数据在开头有11是分配给设备中设备的编号文件,因此它永远不会进入你的else声明。在运行此代码之前,请尝试将设备文件更改为以下内容。

  

1,电压表,25/07 / 2017,555

     

2,万用表,31/08 / 2017,2

     

3,ampermeter,31/07 / 2016,3

     

4,电压表,29/08 / 2016,555

HOWEVER

正如许多其他人所指出的那样,你的方法 非常 脆弱,可能会在很多地方出错。

建议1

在按钮单击事件中,不是获取整行测试并将其传递给DeleteTester()函数,而是提取数字(在示例字符串中,只需1)并将其作为integer

然后在DeleteTester()函数中使用某种适当的CSV阅读器来读取您的设备文件,并在每行末尾隔离参考号,然后转换为integer

现在,不是line.EndsWith(),而是进行integer比较,看看它是否存在。

然后,在else中,再次使用CSV阅读器并隔离每行中的第一个数字,将其转换为int,如果匹配,则删除您的行。

建议2

即使这不是一个非常好的方法。如果你真的想要彻底,我认为你应该使用数据库,或者如果这是一个过度的,至少结构良好的XML文件,来存储你的数据。