0

嗨,我能知道为什么这段代码不起作用,它正在工作,但它也会删除非重复条目,对于某些列表,它会抛出一些错误

前任:

此列表有效,但它也会删除http://test1.com

http://test.com
http://test.com
http://test1.com
http://1test.com

使用此列表将引发此“System.ArgumentNullException 未处理”错误

http://test.com
http://test.com
http://test1.com
http://1test.com
http://etest.com

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog buka = new OpenFileDialog();
    buka.InitialDirectory = "";
    buka.Filter = "Text files(*.txt)|*.txt|All files (*.*)|*.*";
    buka.FilterIndex = 2;
    buka.RestoreDirectory = true;
    buka.Title = "Cari";

    buka.ShowDialog();
    string bukafile = buka.FileName;
    if (!String.IsNullOrEmpty(bukafile))
    {
        StreamReader isiFile = File.OpenText(bukafile);
        while (isiFile.Peek() != -1)
        {
            if (!listBox1.Items.Contains(isiFile.ReadLine()))
            {
                listBox1.Items.Add(isiFile.ReadLine());
            }
        }
            isiFile.Close();
    }
}
4

3 回答 3

3

您应该缓存该行,isiFile.ReadLine()以便比较您添加的同一行。

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog buka = new OpenFileDialog();
    buka.InitialDirectory = "";
    buka.Filter = "Text files(*.txt)|*.txt|All files (*.*)|*.*";
    buka.FilterIndex = 2;
    buka.RestoreDirectory = true;
    buka.Title = "Cari";

    buka.ShowDialog();
    string bukafile = buka.FileName;
    if (!String.IsNullOrEmpty(bukafile))
    {
        StreamReader isiFile = File.OpenText(bukafile);
        while (isiFile.Peek() != -1)
        {
            // use local variable here
            string line = isiFile.ReadLine();
            if (!listBox1.Items.Contains(line))
            {
                listBox1.Items.Add(line);
            }
        }
            isiFile.Close();
    }
}
于 2013-08-22T17:03:33.117 回答
3

如果您没有非常大的文件,则可以使用替换很多代码

var lines = File.ReadLines(bukafile).Distinct();
listBox1.DataSource = lines.ToList();
于 2013-08-22T17:10:29.557 回答
1

您正在阅读两行,每个ReadLine()调用一个。您使用第一行进行.Contains检查,并使用第二行添加到列表框。这两行没有任何关系。

因此,对于第一个列表,您首先检查http://test.com第一行是否在列表框中。不是,所以您巧合地还阅读了下一行,http://test.com并将其添加到列表框中。然后,您检查是否http://test1.com在列表框中,发现它不在,然后继续添加http://1test.com到列表框中。

对于第二个列表,您有奇数个条目,因此最终调用ReadLine返回,我猜是 null,您无法将其添加到列表框中。

修复是

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog buka = new OpenFileDialog();
    buka.InitialDirectory = "";
    buka.Filter = "Text files(*.txt)|*.txt|All files (*.*)|*.*";
    buka.FilterIndex = 2;
    buka.RestoreDirectory = true;
    buka.Title = "Cari";

    buka.ShowDialog();
    string bukafile = buka.FileName;
    if (!String.IsNullOrEmpty(bukafile))
    {
        StreamReader isiFile = File.OpenText(bukafile);
        while (isiFile.Peek() != -1)
        {
            string line = isiFile.ReadLine();
            if (!listBox1.Items.Contains(line))
            {
                listBox1.Items.Add(line);
            }
        }
            isiFile.Close();
    }
}
于 2013-08-22T17:05:40.260 回答