创建一个将文本文件作为参数的函数
Creating a function that takes in a text file as an argument
我承认,我正在学习 C#。我知道我想做什么,这只是语法和调用正确 "stuff" 的问题。
本质上,我想创建一个接受两个参数的函数:
- 一个文本文件
- 一个字符串
从我一直在阅读和试图弄清楚的内容来看,有很多不同的方法可以读取文本文件并做一些事情,但我还没有找到一种真正将其中一个作为参数的方法.我知道如何在 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");
但是,理想情况下,我只想将该死的文件传递给函数。
提前感谢您的帮助。非常感谢。
您不能将整个文件传递给该方法(除非您将其作为字符串读取并传递该字符串)。
我认为最好的方法是将文件路径作为参数传递:
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, ...);
}
}
我认为将 StreamReader
作为参数传递是一个不错的选择。
protected bool FindWordInFile(StreamReader reader, string word_to_find))
应该可以解决问题。
根据您的整体解决方案,您还可以:
- 将文件读入字符串(或数组或其他)并将字符串传递给方法。
- 将文件的路径传递给方法并在那里读取文件。
我认为您的方向是正确的。
你的代码很好,没有什么可做的。
对于测试文件:将其路径传递给函数
然后打开那个文件,在函数代码块里面逐行或者完整的文件读取,然后找到你要找的工作。
using System.IO;
public bool findText(string filePath, string wordToFind)
{
string content = File.ReadAllText(filePath);
if (content.Contains(wordToFind))
{
return true;
}
return false;
}
将 FileInfo class 视为函数的参数。这向您的调用者表明您确实需要一个文件,而不是文件名或文件内容。
将文本文件作为第一个参数 byte[]
的字节数组发送,或者在加载到 string
时将其转换。 Stream
是另一个选项。
要将文本文件传递给方法,您需要一个可以表示文本文件的对象。正如您所说,您可以将 String
对象与文件路径一起使用,但还有其他选择:
FileInfo
:这表示文件及其元数据,但不表示其内容。它具有使用文件数据打开 Stream
的方法。
Stream
:这将文件数据表示为 字节 的流。它有从文件中读取字节的方法。
StreamReader
:这是一个 reader 对象,包装了 Stream
并允许您读取字符(而不是字节)。
查看每个文档以了解它是否适合您的需要以及如何使用它。
无论选择哪个,都必须更改 FindWordInFile
方法以接受指定类型的对象。例如,使用 StreamReader
:
protected bool FindWordInFile(StreamReader textfileReader, string wordToFind)
{
// Do stuff...
}
请注意如何在方法签名中的参数名称之前指定对象的类型(在本例中为StreamReader
)(带有方法名称的行)。
从 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;
}
}
您可以将 using System.IO
行放在 C# 文件的顶部,然后在文件的任何地方只写 StreamReader
,而不是到处写 System.IO.StreamReader
。然后 C# 知道在 System.IO
中查找 StreamReader
.
我可以推荐您尝试使用 Linq 吗?例如:
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)"));
我承认,我正在学习 C#。我知道我想做什么,这只是语法和调用正确 "stuff" 的问题。
本质上,我想创建一个接受两个参数的函数:
- 一个文本文件
- 一个字符串
从我一直在阅读和试图弄清楚的内容来看,有很多不同的方法可以读取文本文件并做一些事情,但我还没有找到一种真正将其中一个作为参数的方法.我知道如何在 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");
但是,理想情况下,我只想将该死的文件传递给函数。
提前感谢您的帮助。非常感谢。
您不能将整个文件传递给该方法(除非您将其作为字符串读取并传递该字符串)。
我认为最好的方法是将文件路径作为参数传递:
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, ...);
}
}
我认为将 StreamReader
作为参数传递是一个不错的选择。
protected bool FindWordInFile(StreamReader reader, string word_to_find))
应该可以解决问题。
根据您的整体解决方案,您还可以:
- 将文件读入字符串(或数组或其他)并将字符串传递给方法。
- 将文件的路径传递给方法并在那里读取文件。
我认为您的方向是正确的。 你的代码很好,没有什么可做的。
对于测试文件:将其路径传递给函数 然后打开那个文件,在函数代码块里面逐行或者完整的文件读取,然后找到你要找的工作。
using System.IO;
public bool findText(string filePath, string wordToFind)
{
string content = File.ReadAllText(filePath);
if (content.Contains(wordToFind))
{
return true;
}
return false;
}
将 FileInfo class 视为函数的参数。这向您的调用者表明您确实需要一个文件,而不是文件名或文件内容。
将文本文件作为第一个参数 byte[]
的字节数组发送,或者在加载到 string
时将其转换。 Stream
是另一个选项。
要将文本文件传递给方法,您需要一个可以表示文本文件的对象。正如您所说,您可以将 String
对象与文件路径一起使用,但还有其他选择:
FileInfo
:这表示文件及其元数据,但不表示其内容。它具有使用文件数据打开Stream
的方法。Stream
:这将文件数据表示为 字节 的流。它有从文件中读取字节的方法。StreamReader
:这是一个 reader 对象,包装了Stream
并允许您读取字符(而不是字节)。
查看每个文档以了解它是否适合您的需要以及如何使用它。
无论选择哪个,都必须更改 FindWordInFile
方法以接受指定类型的对象。例如,使用 StreamReader
:
protected bool FindWordInFile(StreamReader textfileReader, string wordToFind)
{
// Do stuff...
}
请注意如何在方法签名中的参数名称之前指定对象的类型(在本例中为StreamReader
)(带有方法名称的行)。
从 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;
}
}
您可以将 using System.IO
行放在 C# 文件的顶部,然后在文件的任何地方只写 StreamReader
,而不是到处写 System.IO.StreamReader
。然后 C# 知道在 System.IO
中查找 StreamReader
.
我可以推荐您尝试使用 Linq 吗?例如:
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)"));