for loop - “检测到无法访问的代码” - 测试

时间:2017-09-14 18:56:01

标签: c# object for-loop methods tdd

我有以下测试需要通过:

[TestMethod]
public void ShouldRepeatANumberOfTimes()
{
    Simon simon = new Simon();
    Assert.AreEqual("hello hello hello", simon.Repeat("hello", 3)); 
    //So if parameter 3 was to be exchanged with 7, it would write "hello" seven times in one sentence.
}

对于这个任务,我认为for循环是一个自然的解决方案。所以我尝试了这个:

internal object Repeat(string v1, int v2)
{
    for (int i = 0; i < v2; i++)
    {
        return "hello ";
    }

    return v1;
}

我收到以下错误:

  

检测到无法访问的代码。

具体来说,i中的i++下面有一个“错误行”。任何人都能发现什么是错的?提前谢谢。

7 个答案:

答案 0 :(得分:3)

首次迭代(i=0)后,您的方法返回return "hello ";,因此永远不会执行i++。此外,您将无法访问return v1行,因为您已经返回了其他内容。您似乎想要返回(hello v2次+ v1),因此您的代码应该是这样的(请注意yield return用法):

internal IEnumerable<string> Repeat(string v1, int v2)
{
    for (int i = 0; i < v2; i++)
    {
        yield return "hello ";
    }

    yield return v1;
}

答案 1 :(得分:3)

应该有效

internal object Repeat(string v1, int v2)
{
    var str = "";

    for (int i = 0; i < v2; i++)
    {
        str += " " + v1;
    }

    return str.Trim();

}

答案 2 :(得分:1)

您将无法访问该行&#39;返回v1&#39;因为你有这条线&#39;返回&#34;你好&#34;&#39;在你的for循环中。因此,您的程序将在for循环中退出。

答案 3 :(得分:1)

当你总是在第一次迭代中返回某些内容时,你只能运行一次循环。因此,for循环中的i++永远不会执行。

另外,正如Devin Liu正确指出的那样,从循环内部返回一些内容也会使return v1从外部无法访问,因为你(再次总是)之前会返回一些内容。

答案 4 :(得分:1)

您遇到的问题多于错误:

在你的循环中,你总是返回&#34;你好&#34;,无论v1。

您在FIRST迭代中返回"hello ",因此永远不会重新return v1;

如果你传递0作为第二个参数,它仍然会返回v1一次(从最后一次回复调用)。

即使您修复了该功能,如果将其称为simon.Repeat("hello", 3),结果也会是"hellohellohello"

您可以将函数重写修复为:

    String reps = String.Empty;

    for (int i = 0; i < v2; i++)
    {
        reps = string.Concat(reps, v1);
    }

    return reps;

你的测试为:

    Assert.AreEqual("hellohellohello", simon.Repeat("hello", 3)); 

答案 5 :(得分:1)

正如其他提到的,你的功能总是会结束这一行

import json
print json.dumps([['a','b','c'], ['d','e','f']]);

要重复你的字符串,你可以使用这样的东西而不需要任何循环。

<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
$arr = json_decode($output);
var_dump($arr);
?>

只需将此单行放入您的函数中,并将return "hello "; return string.Join(" ", Enumerable.Repeat("Hello", 2)); 替换为您的参数

答案 6 :(得分:1)

此方法将返回一个字符串而不是一个列表,并添加正确的空格量,因为测试用例没有尾随空格。

internal object Repeat(string v1, int v2)
{

    var output = string.empty;
    for (int i = 0; i < v2; i++)
    {
        output += v1;
        if(i <= v2-1)
        {
            output += " ";
        }
    }

    return output ;
}

我推荐的其他一些方法: 如果你认为你将构建非常大的字符串,我建议使用StringBuilder,我不只是尽可能快地编写它。 你也可以在循环结束时删除尾随空格,我只是不想从头开始添加它。