创建一个将文本文件作为参数的函数

Creating a function that takes in a text file as an argument

我承认,我正在学习 C#。我知道我想做什么,这只是语法和调用正确 "stuff" 的问题。

本质上,我想创建一个接受两个参数的函数:

  1. 一个文本文件
  2. 一个字符串

从我一直在阅读和试图弄清楚的内容来看,有很多不同的方法可以读取文本文件并做一些事情,但我还没有找到一种真正将其中一个作为参数的方法.我知道如何在 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))

应该可以解决问题。

根据您的整体解决方案,您还可以:

  1. 将文件读入字符串(或数组或其他)并将字符串传递给方法。
  2. 将文件的路径传递给方法并在那里读取文件。

我认为您的方向是正确的。 你的代码很好,没有什么可做的。

对于测试文件:将其路径传递给函数 然后打开那个文件,在函数代码块里面逐行或者完整的文件读取,然后找到你要找的工作。

    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)"));