删除不重复的重复项

时间:2013-08-22 17:01:01

标签: c# .net

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

例如:

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:3)

如果您没有非常大的文件,可以使用

替换大量代码
var lines = File.ReadLines(bukafile).Distinct();
listBox1.DataSource = lines.ToList();

答案 2 :(得分: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();
    }
}