检查是否在文本文件中找到了项目

时间:2012-11-30 20:25:21

标签: c# duplicates streamwriter

如何检查文本文件是否包含列表框中的项目。停止保存重复项。我不确定我会添加什么。这是在按钮单击事件上调用的。例如,如果找到重复,我可以显示MessageBox.Show ("duplicate error");

 using (StreamWriter writer = new StreamWriter("test.txt", true))
        {
            foreach (object item in listBox2.Items)
            {
                writer.WriteLine(item.ToString());
            }
        }    

2 个答案:

答案 0 :(得分:3)

在写入“test.txt”之前,请列举其内容:

var fileLines = File.ReadAllLines("test.txt");
List<string> fileItems = new List<string>(fileLines);

然后在编写每个项目之前,检查列表是否包含它:

using (StreamWriter writer = new StreamWriter("test.txt", true))
{
    foreach (object item in listBox2.Items)
    {
        if (fileItems.Contains(item))
            // Do something, break, etc.
        else
            writer.WriteLine(item.ToString());
    }
}

修改

根据建议,您可以使用HashSet代替List来提高效果,因为它只能包含唯一值。

另一项改进可能是在向文件写入任何内容之前检查是否存在任何重复项。我在下面的例子中用LINQ语句完成了这个:

var fileLines = File.ReadAllLines("test.txt");
HashSet<string> fileItems = new HashSet<string>(fileLines);

using (StreamWriter writer = new StreamWriter("test.txt", true))
{
    bool duplicateFound = fileItems.Any(fi => listBox1.Items.Cast<string>().Any(i => i == fi));

    if (duplicateFound)
        MessageBox.Show("Duplicate items found.");
    else
        foreach (object item in listBox1.Items)
            writer.WriteLine(item.ToString());
}

编辑2:

正如@Servy建议的那样,列表框可​​能包含重复项,这也应该被考虑在内。此外,我的HashSet实现低于标准。所以在第三个例子中,我首先检查列表框是否包含重复项,然后是否有任何列表框项已经在文件中。 HashSet的使用也更高效,因为我没有迭代它。

var fileLines = File.ReadAllLines("test.txt");
HashSet<string> fileItems = new HashSet<string>(fileLines);
List<string> duplicateListboxItems = listBox1.Items.Cast<string>().GroupBy(l => l).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
if (duplicateListboxItems.Count > 0)
{
    MessageBox.Show("The listbox contains duplicate entries.");
    return;
}

bool duplicateFound = false;
List<string> outputItems = new List<string>();
foreach (string item in listBox1.Items)
{
    if (fileItems.Contains(item))
    {
        MessageBox.Show(String.Format("The file has a duplicate: {0}", item));
        duplicateFound = true;
        break;
    }
    outputItems.Add(item);
}

if (duplicateFound)
    return;

using (StreamWriter writer = new StreamWriter("test.txt", true))
{
    foreach (string s in outputItems)
        writer.WriteLine(s);
}

答案 1 :(得分:1)

string filePath = "test.txt";
var existingLines = new HashSet<string>(File.ReadAllLines(filePath));

var linesToWrite = new List<string>();
foreach (string item in listBox2.Items)
{
    if (existingLines.Add(item))
    {
        linesToWrite.Add(item);
    }
    else
    {
        //this is a duplicate!!!
    }
}

File.AppendAllLines(filePath, linesToWrite);