1

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

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

2 回答 2

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());
    }
}

编辑:

根据建议,您可以使用 aHashSet而不是 aList来提高性能,因为它只能包含唯一值。

另一个改进可能是在将任何内容写入文件之前检查是否存在任何重复项。我在下面的示例中的 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);
}
于 2012-11-30T20:29:41.577 回答
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);
于 2012-11-30T20:29:08.337 回答