C#分割功能不起作用

时间:2017-04-19 11:41:46

标签: c# string split

我正在尝试拆分由单词构成的字符串,用分隔符“ - ”和“,”分隔。问题是我的程序根本不想在“var tokens”中保存任何内容。我已经尝试将“tokens”设为字符串[],尝试使用char []分隔符而不是直接在Split方法中放入“ - ”,并尝试使用语法“StringSplitOptions.RemoveEmptyEntries,但没有任何作用。

这是我的代码:

        if (!string.IsNullOrEmpty(destin) && string.IsNullOrEmpty(depar))
        {
            try
            {
                writer.WriteLine("SearchDest");
                writer.WriteLine(destin);
                string retur = reader.ReadLine();
                Debug.WriteLine(retur);
                var tokens = retur.Split('-');
                flight.Clear();
                foreach (string s in tokens)
                {
                    Debug.WriteLine(s);
                    String[] flyelem = s.Split(',');
                    int idf = Convert.ToInt32(flyelem[0]);
                    String destf = flyelem[1];
                    String airf = flyelem[2];
                    int frees = Convert.ToInt32(flyelem[3]);
                    String datef = flyelem[4];
                    Flight b = new Flight(idf, destf, airf, frees, datef);
                    flight.Add(b);
                }

                dataGridView3.DataSource = null;
                dataGridView3.Refresh();
                dataGridView3.DataSource = flight;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

string retur = reader.ReadLine();
Debug.WriteLine(retur);

将打印:-6,Moscow,Domodedovo,30,4/3/2017 12:00:00 AM-7,Moscow,Vnukovo,30,4/3/2017 12:00:00 AM-9,Moscow,Vnukovo,40,4/3/2017 12:00:00 AM

和“Debug.WriteLine(s);”行将始终不打印任何内容,只是一个空格,程序在尝试将字符串解析为int idf时的int时停止。

如何解决此问题并使拆分工作?谢谢。

编辑: 问题已解决。 Tommy Naidich建议使用新的[] {' - '}和Gunther Fox使用StringSplitOptions.RemoveEmptyEntries作为第二个参数工作,现在拆分按预期工作。对于将来会遇到此问题的人的最终代码。谢谢你们。

        if (!string.IsNullOrEmpty(destin) && string.IsNullOrEmpty(depar))
        {
            try
            {
                writer.WriteLine("SearchDest");
                writer.WriteLine(destin);
                string retur = reader.ReadLine();
                Debug.WriteLine(retur);
                string[] output = retur.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
                flight.Clear();
                foreach (string s in output)
                {
                    Debug.WriteLine(s);
                    string[] flyelem = s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    int idf = Convert.ToInt32(flyelem[0]);
                    string destf = flyelem[1];
                    string airf = flyelem[2];
                    int frees = Convert.ToInt32(flyelem[3]);
                    string datef = flyelem[4];
                    Flight b = new Flight(idf, destf, airf, frees, datef);
                    flight.Add(b);
                }

                dataGridView3.DataSource = null;
                dataGridView3.Refresh();
                dataGridView3.DataSource = flight;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

2 个答案:

答案 0 :(得分:1)

使用以下语法并根据需要进行更改。

string input = "-6,Moscow,Domodedovo,30,4/3/2017 12:00:00 AM-7,Moscow,Vnukovo,30,4/3/2017 12:00:00 AM-9,Moscow,Vnukovo,40,4/3/2017 12:00:00 AM";
string[] output = input.Split(new[] {'-', ','});

foreach(string s in output)
    Console.WriteLine(s); // Will print each one of the split words.

答案 1 :(得分:1)

您的主要问题在于在尝试解析为int之前不检查s是否为空。在转换之前添加额外的检查意味着循环将正确跳过数组中的第一个元素,该元素为空,因为您的字符串以-开头。

此外,您使用的是String,而不是string。请参阅this answer,了解为何不建议这样做。

您还可以使用int.TryParse代替Convert.ToInt32进行额外的错误检查。

<强> Working dotnetfiddle

if (!string.IsNullOrEmpty(destin) && string.IsNullOrEmpty(depar))
{
    try
    {
        writer.WriteLine("SearchDest");
        writer.WriteLine(destin);
        string retur = reader.ReadLine();
        Debug.WriteLine(retur);
        string[] tokens = retur.Split('-');
        flight.Clear();

        foreach (string s in tokens)
        {
            Debug.WriteLine(s);
            if (!string.IsNullOrEmpty(s))
            {
                string[] flyelem = s.Split(',');
                int idf;
                int frees;

                if (int.TryParse(flyelem[0], out idf) &&
                    int.TryParse(flyelem[3], out frees))
                {

                    string destf = flyelem[1];
                    string airf = flyelem[2];
                    string datef = flyelem[4];
                    Flight b = new Flight(idf, destf, airf, frees, datef);
                    flight.Add(b);
                }
            }
        }

        dataGridView3.DataSource = null;
        dataGridView3.Refresh();
        dataGridView3.DataSource = flight;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}