【问题标题】:send a String array as parameter to a function将字符串数组作为参数发送给函数
【发布时间】:2011-12-27 01:14:14
【问题描述】:

我在一个名为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 中的模式,所以也许还有其他方法。
能给我解惑吗?

【问题讨论】:

  • if (line.Contains(pat) == true) 可以更改为if (line.Contains(pat)) 而不失去任何意义

标签: c# design-patterns parameter-passing arrays


【解决方案1】:

从您的参数中删除 []。

例如

int counter = Function.SearchedRecords(file);

是的,您对 Contains 方法行为的假设是正确的 - 您将匹配包含五个连续破折号的任何行,无论它们之前或之后是什么字符。

如果您想准确解析五个破折号,在它们之前或之后没有任何内容,我建议您查看 RegEx 类(正则表达式)。

【讨论】:

  • 谢谢,但现在我收到另一个错误。非静态字段、方法、por 属性(Function.SearchMethod([]))需要对象引用
  • 那是因为您像调用静态方法一样调用 SearchedRecords,但没有将其声明为静态方法。为了让它像你的代码一样工作,你要么需要创建一个“Function”类的新实例,要么定义这样的方法:“public static int SearchedRecords(String [] recs)”
【解决方案2】:

改变

int counter = Function.SearchedRecords( []file);

int counter = Function.SearchedRecords(file);

是的,这对那个字符串有效。 但是Contains 是区分大小写的,如果您要匹配名称或另一个带有字母字符的字符串,则大小写必须相同才能匹配,例如line.Contains("Binary Worrier") 不会匹配字符串“Hello binary worrier”。

此外,如果您知道文件将总是很小,则将整个文件读入内存也可以,但文件越大,此方法的效率就越低。 最好始终使用System.IO.StreamReaderSystem.IO.File.ReadLines 之类的东西(在.Net 4 及更高版本中可用),这些允许您一次使用一行文件。例如

using (var reader = new System.IO.StreamReader("MyFile.txt"))
{
    while(!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        if (line.Contains(pattern))
            counter++;
    }
}

【讨论】:

    【解决方案3】:

    改成

     int counter = Function.SearchedRecords(file);
    

    【讨论】:

    • 谢谢,但现在我收到另一个错误。非静态字段、方法、por 属性(Function.SearchMethod([]))需要对象引用
    【解决方案4】:

    从方法调用中删除“[]”。是的,你的函数似乎计算你想要的。

    【讨论】:

    • 谢谢,但现在我收到另一个错误。非静态字段、方法、por 属性(Function.SearchMethod([]))需要对象引用
    【解决方案5】:

    首先你需要创建一个函数类的实例然后运行这个函数。希望以下代码有所帮助

    Function fb = new Function();
    int counter = fb.SearchedRecords(file);
    

    现在,您将 SearchRecords 用作不需要实例化的静态类的静态函数。

    【讨论】:

      【解决方案6】:

      您可以使用 LINQ 以更短的方式执行此操作:

       int counter = file.Count(line => line.Contains("-----"));
      

      【讨论】:

        猜你喜欢
        • 2019-03-19
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 2010-10-03
        • 1970-01-01
        相关资源
        最近更新 更多