如何组合两个功能进行文件删除

本文关键字:功能 文件 删除 两个 何组合 组合 | 更新日期: 2023-09-27 18:35:05

我有两个不同的函数来处理两种不同类型的输入文本文件。一个带双引号的文本文件和一个不带双引号的文本文件。

我想知道如何将这两个函数组合成一个通用的函数,以便我可以以更有效的方式处理

法典:

//this the function to handle text file without double quotes
public void stack1()
    {
        string old;
        string iniPath = Application.StartupPath + "''list.ini";
        bool isDeleteSectionFound = false;
        List<string> deleteCodeList = new List<string>();
        using (StreamReader sr = File.OpenText(iniPath))
        {
            while ((old = sr.ReadLine()) != null)
            {
                if (old.Trim().Equals("[DELETE]"))
                {
                    isDeleteSectionFound = true;
                }
                if (isDeleteSectionFound && !old.Trim().Equals("[DELETE]"))
                {
                    deleteCodeList.Add(old.Trim());
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        using (StreamReader reader = File.OpenText(textBox1.Text))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var value = line.Split(''t');
                bool deleteLine = value.Any(v => deleteCodeList.Any(w => v.Equals(w)));
                if (!deleteLine)
                {
                    sb.Append(line + Environment.NewLine);
                }
            }
        }
        File.WriteAllText(textBox1.Text, sb.ToString());
        //return;
    }
     //this the function to handle text file with double quotes
    public void stack()
    {
        string old;
        string iniPath = Application.StartupPath + "''list.ini";
        bool isDeleteSectionFound = false;
        List<string> deleteCodeList = new List<string>();
        using (StreamReader sr = File.OpenText(iniPath))
        {
            while ((old = sr.ReadLine()) != null)
            {
                if (old.Trim().Equals("[DELETE]"))
                {
                    isDeleteSectionFound = true;
                }
                if (isDeleteSectionFound && !old.Trim().Equals("[DELETE]"))
                {
                    deleteCodeList.Add(old.Trim());
                }
            }
        }
        StringBuilder sb = new StringBuilder();
        using (StreamReader reader = File.OpenText(textBox1.Text))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(''t').Select(v => v.Trim(' ', '"'));
                bool deleteLines = values.Any(v => deleteCodeList.Any(w => v.Equals(w)));
                if (!deleteLines)
                {
                    sb.Append(line + Environment.NewLine);
                }
            }
        }
        File.WriteAllText(textBox1.Text, sb.ToString());
        MessageBox.Show("finish");
    }

如何组合两个功能进行文件删除

这两个函数之间的唯一区别是这一行:

// stack1 function
var value = line.Split(''t');
// stack2 function
var values = line.Split(''t').Select(v => v.Trim(' ', '"'));

最简单的方法可能是向方法添加一个参数,然后在拆分后添加检查:

public void Split(bool shouldTrimQuotes)
{
     ...
     IEnumerable<string> value = line.Split(''t');         
     if (shouldTrimQuotes)
     {
         value = value.Select(v => v.Trim(' ', '"'));
     }
     ...
}

在一种情况下,您将传递true作为参数(这将导致引号被修剪),而在第二种情况下,您将传递false以指示您不想修剪它们:

// split, but don't trim quotes before comparison
Split(shouldTrimQuotes: false);
// split, trim quotes before comparison
Split(shouldTrimQuotes: true);

你也可以玩一点,尝试重构整个事情,尝试将较小的通用代码片段提取到单独的方法中,这可能会更清楚地说明它们在做什么。这是一种方法,例如:

// rewrites the specified file, removing all lines matched by the predicate
public static void RemoveLinesFromFile(string filename, Func<string, bool> match)
{
    var linesToKeep = File.ReadAllLines(filename)
        .Where(line => match(line))
        .ToList();
    File.WriteAllLines(filename, linesToKeep);
}
// gets the list of "delete codes" from the specified ini file
public IList<string> GetDeleteCodeList(string iniPath)
{
    return File.ReadLines(iniPath)
        .SkipWhile(l => l.Trim() != "[DELETE]")
        .Skip(1).ToList();
}
// removes lines from a tab-delimited file, where the specified listOfCodes contains
// at least one of the tokens inside that line
public static void RemoveLinesUsingCodeList(
    string filename,
    IList<string> listOfCodes,
    bool shouldTrimQuotes)
{
    RemoveLinesFromFile(filename, line =>
    {
        IEnumerable<string> tokens = line.Split(''t');               
        if (shouldTrimQuotes)
        {
            tokens = tokens.Select(v => v.Trim(' ', '"'));
        }
        return (tokens.Any(t => listOfCodes.Any(t.Equals)));
    });
}