我承认,我正在学习C#。我知道我想做什么,这只是一个语法问题,并调用正确的“东西”。
基本上,我想创建一个带有两个参数的函数:
从我一直在阅读并试图弄清楚,有很多不同的方法来阅读文本文件并做一些事情,但我没有遇到过一种实际上以一种方式作为参数的方法。我知道如何在C#中创建具有特定类型的数据类型的函数,如bool,string,int,decimal等。
所以,基本上它就像这样(我的梦想,所以说)
protected bool FindWordInFile((textfile), string word_to_find) //Generic Function that takes in a word list file as an argument and a search word and returns if there is a match or not
{
//Do stuff
bool FoundIt = false;
return FoundIt;
}
现在,我想这样做的原因是我想要使用不同的文本文件来查找内容,而不是为我想要的每种搜索类型创建单独的函数。
所以,可以想象,我能做到:
bool IsThereGoodStuff = FindWordInFile("goodstuff.txt", "awesome");
bool IsThereBadStuff = FindWordInFile("badstuff.txt", "terrible");
或者,我可以从文件创建一个数组并将数组作为参数传递,但我宁愿不这样做。考虑到文本文件的大小,数组不会那么大,或者我可以将文本文件的内容转换为字符串并传递它。无论哪种方式,我都想避免它。
我试图用这种方法来创建一个StreamReader对象,但我还没有找到一种方法将该参数传递给函数。如果有办法做到这一点,太好了!
StreamReader goodwordsfile = new StreamReader("c:\\wordfilelib\\goodwords.txt");
但是,理想情况下,我只想将该死的文件传递给该函数。
提前感谢您的帮助。非常感谢。
答案 0 :(得分:2)
将FileInfo类视为函数的参数。这表示您的调用者确实希望文件而不是文件名或文件内容。
答案 1 :(得分:2)
要将文本文件传递给方法,您需要一个可以表示文本文件的对象。正如你所说,你可以使用String
对象和文件的路径,但也有其他选择:
FileInfo
:这表示文件及其元数据,但不代表其内容。它有方法可以使用文件的数据打开Stream
。Stream
:这表示文件的数据为 bytes 的流。它有从文件中读取字节的方法。StreamReader
:这是一个包装Stream
的读者对象,允许您读取字符(而不是字节)。查看每个文档以了解它是否符合您的需求以及如何使用它。
无论您选择哪种方式,都必须更改FindWordInFile
方法以接受指定类型的对象。例如,使用StreamReader
:
protected bool FindWordInFile(StreamReader textfileReader, string wordToFind)
{
// Do stuff...
}
注意如何在方法签名中的参数名称之前指定类型的对象(在这种情况下为StreamReader
)(具有方法' s的行)名称)。
从StreamReader
:
using System.IO;
class MyClass
{
protected bool FindWordInFile(StreamReader textfileReader, string wordToFind)
{
// Read the first line.
string line = textfileReader.ReadLine();
// The current line must not be null,
// or we've reached the end of the file.
while (line != null)
{
// TODO: Go find your word in the current line.
// Read the next line.
line = textfileReader.ReadLine();
}
// We didn't find the word in the file.
return false;
}
}
不是在任何地方写System.IO.StreamReader
,而是将行using System.IO
放在C#文件的顶部,只在文件中的任何地方写StreamReader
。然后C#知道要查看System.IO
以查找StreamReader
。
答案 2 :(得分:2)
我可以建议您尝试使用 Linq 吗? e.g:
Boolean found = File
.ReadLines(@"C:\MyFile.txt") // <- Your file name
.Any(line => line.Contains(word_to_find)); // <- Word to find
使用Linq,您不需要任何方法来实现并拥有一个行解决方案。
编辑:如果你必须找到单词,例如"the"
,但不是"then"
您可以使用正则表达式而非简单Contains()
来修改解决方案:
Boolean found = File
.ReadLines(@"C:\MyFile.txt")
.Any(line => Regex.IsMatch(line, @"(^|\W)" + word_to_find + @"($|\W)"));
答案 3 :(得分:1)
您无法将整个文件传递给该方法(除非您将其作为字符串读取并传递该字符串)。
我认为执行所需操作的最佳方法是将文件路径作为参数传递:
protected bool FindWordInFile(string filePath, string word_to_find)
{
using (StreamReader sr = new StreamReader(filePath))
{
...
}
}
或者,您可以直接传递Stream
对象,这样您就可以:
protected bool FindWordInFile(StreamReader sr, string word_to_find)
{
...
}
并称之为:
foreach(string filePath in filePaths)
{
using (StreamReader sr = new StreamReader(filePath))
{
FindWordInFile(sr, ...);
}
}
答案 4 :(得分:1)
我认为将StreamReader
作为参数传递是一个不错的选择。
protected bool FindWordInFile(StreamReader reader, string word_to_find))
应该这样做。
根据您的整体解决方案,您还可以:
答案 5 :(得分:1)
我认为你走在正确的轨道上。 你的代码很好,没有什么额外的事情要做。
表示测试文件:将其路径传递给该函数 然后打开该文件,逐行读取或完成功能代码块内的文件,然后找到您要查找的工作。
using System.IO;
public bool findText(string filePath, string wordToFind)
{
string content = File.ReadAllText(filePath);
if (content.Contains(wordToFind))
{
return true;
}
return false;
}
答案 6 :(得分:0)
将第一个参数的文本文件作为字节byte[]
的数组发送,或在加载到string
时将其转换。 Stream
是另一种选择。