我在名为Function
的类中有一个函数,如下所示:
public int SearchedRecords(String [] recs)
{
int counter = 0;
String pat = "-----";
String[] records = recs;
foreach (String line in records)
{
if (line.Contains(pat) == true)
{
counter++;
}
}
return counter;
}
我用这种方式从我的主类中调用这个方法:
String [] file = File.ReadAllLines("C:/Users.../results.txt");
int counter = Function.SearchedRecords( []file);
但是我收到一个错误说:
;预期
有什么问题?
另一个问题:上面的函数是从文件中计算出所有具有模式-----
的行(即使有更多破折号,或者如果行在破折号之前或之后有一些字符)。我是对的吗?
它类似于Java中的模式,所以也许还有另一种方式 你能开导我吗?
答案 0 :(得分:4)
从参数中删除[]。
e.g。
int counter = Function.SearchedRecords(file);
是的,您对Contains方法行为的假设是正确的 - 您将匹配包含五个连续破折号的任何行,无论其前后是什么字符。
如果你想解析五个破折号,在它们之前或之后没有任何内容,我建议查看RegEx类(正则表达式)。
答案 1 :(得分:2)
更改
int counter = Function.SearchedRecords( []file);
到
int counter = Function.SearchedRecords(file);
是的,对于该字符串,这将有效。
但是Contains
区分大小写,如果您在名称上匹配,或者使用字母字符匹配另一个字符串,则大小写必须与匹配,例如匹配。 line.Contains("Binary Worrier")
与字符串“Hello binary worrier”不匹配。
此外,如果您知道文件将始终很小,则将整个文件读入内存即可,此方法文件越大效率越低。
最好始终使用System.IO.StreamReader
或System.IO.File.ReadLines
(在.Net 4及更高版本中可用),这些允许您一次使用一行文件。 e.g。
using (var reader = new System.IO.StreamReader("MyFile.txt"))
{
while(!reader.EndOfStream)
{
string line = reader.ReadLine();
if (line.Contains(pattern))
counter++;
}
}
答案 2 :(得分:1)
将其更改为
int counter = Function.SearchedRecords(file);
答案 3 :(得分:1)
从方法调用中删除“[]”。是的,你的功能似乎算你想要的。
答案 4 :(得分:1)
首先,您需要创建一个函数类实例,然后运行该函数。希望以下代码有帮助
Function fb = new Function();
int counter = fb.SearchedRecords(file);
目前,您正在使用SearchRecords作为静态类的静态函数,不需要实例化。
答案 5 :(得分:1)
您可以使用LINQ以更短的方式执行此操作:
int counter = file.Count(line => line.Contains("-----"));