C# 如何结合两种功能';用于删除文件的
我有两个不同的函数来处理两种不同类型的输入文本文件。一个带双引号的文本文件和一个不带双引号的文本文件 我想知道如何将这两个函数组合成一个通用的函数,以便以更有效的方式处理 代码:C# 如何结合两种功能';用于删除文件的,c#,string,text,text-files,tab-delimited-text,C#,String,Text,Text Files,Tab Delimited Text,我有两个不同的函数来处理两种不同类型的输入文本文件。一个带双引号的文本文件和一个不带双引号的文本文件 我想知道如何将这两个函数组合成一个通用的函数,以便以更有效的方式处理 代码: //此函数用于处理不带双引号的文本文件 公共空间1() { 串旧; 字符串iniPath=Application.StartupPath+“\\list.ini”; bool isDeleteSectionFound=false; List deleteCodeList=新列表(); 使用(StreamReader s
//此函数用于处理不带双引号的文本文件
公共空间1()
{
串旧;
字符串iniPath=Application.StartupPath+“\\list.ini”;
bool isDeleteSectionFound=false;
List deleteCodeList=新列表();
使用(StreamReader sr=File.OpenText(iniPath))
{
而((old=sr.ReadLine())!=null)
{
if(old.Trim()等于(“[DELETE]”)
{
isDeleteSectionFound=true;
}
if(isDeleteSectionFound&!old.Trim()等于(“[DELETE]”)
{
deleteCodeList.Add(old.Trim());
}
}
}
StringBuilder sb=新的StringBuilder();
使用(StreamReader=File.OpenText(textBox1.Text))
{
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var value=line.Split('\t');
bool deleteLine=value.Any(v=>deleteCodeList.Any(w=>v.Equals(w));
如果(!deleteLine)
{
sb.Append(line+Environment.NewLine);
}
}
}
File.writealText(textBox1.Text,sb.ToString());
//返回;
}
//此函数用于处理带有双引号的文本文件
公共空堆栈()
{
串旧;
字符串iniPath=Application.StartupPath+“\\list.ini”;
bool isDeleteSectionFound=false;
List deleteCodeList=新列表();
使用(StreamReader sr=File.OpenText(iniPath))
{
而((old=sr.ReadLine())!=null)
{
if(old.Trim()等于(“[DELETE]”)
{
isDeleteSectionFound=true;
}
if(isDeleteSectionFound&!old.Trim()等于(“[DELETE]”)
{
deleteCodeList.Add(old.Trim());
}
}
}
StringBuilder sb=新的StringBuilder();
使用(StreamReader=File.OpenText(textBox1.Text))
{
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var values=line.Split('\t')。选择(v=>v.Trim('''');
bool deleteLines=values.Any(v=>deleteCodeList.Any(w=>v.Equals(w));
如果(!deleteLines)
{
sb.Append(line+Environment.NewLine);
}
}
}
File.writealText(textBox1.Text,sb.ToString());
MessageBox.Show(“完成”);
}
这两个功能之间的唯一区别是这一行:
// 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(' ', '"'));
}
...
}
您还可以玩一点,尝试重构整个过程,尝试将较小的通用代码片段提取到单独的方法中,这样可以更清楚地了解它们在做什么。这是一种方法,例如:
// 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)));
});
}
//重写指定的文件,删除谓词匹配的所有行
公共静态void RemoveLinesFromFile(字符串文件名,Func匹配)
{
var linestokep=File.ReadAllLines(文件名)
.其中(行=>匹配(行))
.ToList();
File.writeAllines(文件名,linestokep);
}
//从指定的ini文件获取“删除代码”列表
公共IList GetDeleteCodeList(字符串路径)
{
返回文件.ReadLines(iniPath)
.SkipWhile(l=>l.Trim()!=“[DELETE]”)
.Skip(1.ToList();
}
//从以制表符分隔的文件中删除行,其中指定的listOfCodes包含
//该行中至少有一个令牌
使用代码列表删除公共静态无效项(
字符串文件名,
IList代码列表,
布尔应该(引用)
{
RemoveLinesFromFile(文件名,行=>
{
IEnumerable tokens=line.Split('\t');
if(shouldTrimQuotes)
{
令牌=令牌。选择(v=>v.Trim(“”“);
}
return(tokens.Any(t=>listOfCodes.Any(t.Equals));
});
}
我认为不需要任何参数。双引号不是文件名中的有效符号。您可以随时调整输入。@neolick:我认为这些值不是必需的文件名。OP正在分析一个以制表符分隔的文件,但在某些情况下只想修剪引号。@Groo您能告诉我如何添加参数吗。我对这件事真的很陌生。。此外,我还遇到一个错误无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“string[]”。存在显式转换(是否缺少强制转换?
value=value.选择(v=>v.Trim('''''));`@stacy:是的,对不起,value
变量的类型应显式设置为IEnumerable
,否则编译器将使用string[]
因为var
关键字。@stacy:删除第一个方法,修改第二个方法,使其具有输入参数和if
子句。最终得到一个方法,该方法根据其输入参数的行为不同。
// 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)));
});
}