C#如何检测文本文件中两个字符串是否相同

时间:2017-03-20 20:58:02

标签: c# winforms

我有一个程序,它正在写一个保存文件。它目前通过检查列表框并简单地将其内容写入文本文件来完成此任务。

我想要的是,如果文本文件在文本文件中检测到2个相同的字符串,它将删除其中一个。

imports:
    - { resource: config.yml }

framework:
    router:
        resource: "%kernel.root_dir%/config/routing_dev.yml"
        strict_requirements: true
    profiler: { only_exceptions: false }

web_profiler:
    toolbar: true
    intercept_redirects: false

monolog:
    handlers:
        main:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        firephp:
            type:  firephp
            level: info
        chromephp:
            type:  chromephp
            level: info

assetic:
    use_controller: true

让我们说在textfile中包含这个:

path = @"C:\thing.txt";
if (!File.Exists(path))
{
    FileStream fs = File.Create(path);
    fs.Close();
}

if (checkedListBox1.Items.Count > 0)
{
    using (TextWriter tw = File.AppendText(path)) 
    {
        foreach (string fileName in fullFileName) 
        {
            foreach (string item in checkedListBox1.Items)
                tw.WriteLine(fileName); //writes file path to textfile
        }
    }
}
else
{
    //nothing to do! There is nothing to save!
}

我不希望文本文件有

C:\Jack.exe
C:\COolstuff.exe

相反,我希望它删除第三行:C:\ Jack.exe,因为它匹配第一行。

3 个答案:

答案 0 :(得分:3)

如果没有看到代码的其余部分,我相信您可以使用LINQ的Distinct()来快速完成此任务。

foreach (string fileName in fullFileName.Distinct())

这将导致foreach仅返回唯一字符串。请记住,您可能需要添加对LINQ命名空间的引用。如果你在Distinct()上收到错误,请将光标放在它上面并使用ctrl+,让VS为你建议。

答案 1 :(得分:0)

如果要删除文本文件中的重复项,可以执行的操作是读取数组中的所有行而不是将其更改为List,这样您就可以使用Distinct()然后使用新文件重写为文本文件像这样的列表:

string[] lines = File.ReadAllLines(filePath);

List<string> list = lines.ToList();

list = list.Distinct().ToList();

File.WriteAllLines(filePath, list.ToArray());

有关Distinct的更多信息。

答案 2 :(得分:0)

如果我理解正确,因为您只想保存唯一值,那么最好先读取保存的值,以便将它们与新值进行比较。

代码流看起来像:

  1. 保存文件是否存在?
    • 不 - &gt;创建空文件名列表
    • 是 - &gt;将文件内容保存到fileName列表中
  2. 对于选中列表框中的每个项目
    • 如果fileName列表不包含它,请将其添加到newFiles列表
  3. 将newFiles列表的内容附加到文件
  4. 在实践中,这可能如下所示:

    string saveFilePath = @"c:\data\savedFiles.txt";
    List<string> savedFileNames = new List<string>();
    List<string> newFileNames = new List<string>();
    
    // If our save file exists, read all contents into the 'saved file' list
    if (File.Exists(saveFilePath))
    {
        savedFileNames.AddRange(File.ReadAllLines(saveFilePath));
    }
    
    // For each item in our check box, add it to our 'new 
    // file' list if it doesn't exist in the 'saved file' list
    foreach (var checkedItemin CheckedListBox1.CheckedItems)
    {
        if (!savedFileNames.Contains(checkedItem))
        {
            newFileNames.Add(checkedItem.ToString());
        }
    }
    
    // Append our new file names to the end of the saved file (this
    // will also create the file for us if it doesn't already exist)
    File.AppendAllLines(saveFilePath, newFileNames);