删除不起作用的重复项

本文关键字:不起作用 删除 | 更新日期: 2023-09-27 18:28:36

嗨,我能知道为什么这个代码不起作用吗?它起作用了,但它也会删除不重复的条目,对于一些列表,它会抛出一些错误

例如:

此列表有效,但也将删除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();
    }
}

删除不起作用的重复项

您应该缓存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();
    }
}

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

var lines = File.ReadLines(bukafile).Distinct();
listBox1.DataSource = lines.ToList();

您正在读取两行,每个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();
    }
}