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

时间:2015-02-19 08:43:58

标签: c# text-files

我承认,我正在学习C#。我知道我想做什么,这只是一个语法问题,并调用正确的“东西”。

基本上,我想创建一个带有两个参数的函数:

  1. 文本文件
  2. 字符串
  3. 从我一直在阅读并试图弄清楚,有很多不同的方法来阅读文本文件并做一些事情,但我没有遇到过一种实际上以一种方式作为参数的方法。我知道如何在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");
    

    但是,理想情况下,我只想将该死的文件传递给该函数。

    提前感谢您的帮助。非常感谢。

7 个答案:

答案 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))

应该这样做。

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

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

答案 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是另一种选择。