如何在C#中迭代数组的内容,然后仍然返回整个数组?

时间:2013-04-11 02:25:18

标签: c# arrays for-loop scope

家庭作业:我正在设计一个刽子手游戏。

我有一个数组(名为wordToGuess[]),表示需要猜测的单词。我将它与该单词的蒙版副本进行比较,(名为displayString[] - 我知道为了清晰起见我仍然要重命名)。例如,如果wordToGuess[][S][T][A][C][K],则displayString[]会初始化为[*][*][*][*][*]。当用户猜到一个字母时,我想迭代遍历数组的每个字符,如果匹配则将*替换为字母猜测。如果我猜A(这是变量letterGuess),例如,A将与数组的每个元素进行比较。如果匹配,则该元素将更改为[A]。如果不匹配,则元素仍为[*]。此特定情况下的最终结果应该是填充了[*][*][A][*][*]的数组。

  public char[] drawProgress(char letterGuess, char[] wordToGuess, char[] displayString)
    {
        for (int a = 0; a < wordToGuess.Length; a++)
        {
            if (wordToGuess[a] == letterGuess)
            {
                displayString[a] = letterGuess;
            }
            return displayString;
        }
    }

修改 这是我的问题: for循环的开头标记为unreachable code,我收到Error 4 'assn5.PromptForLetter.drawProgress(char, char[], char[])': not all code paths return a value的错误消息。

我最初认为这是一个范围问题,但评论者解释说不是......

所以...如果我的回归范围,导致错误的原因是什么?我错过了什么?

2 个答案:

答案 0 :(得分:2)

    public char[] drawProgress(char letterGuess, char[] wordToGuess, char[] displayString)
    {
        for (int a = 0; a < wordToGuess.Length; a++)
        {
            if (wordToGuess[a] == letterGuess)
            {
                displayString[a] = letterGuess;
            }
        }
        return displayString;
    }

通过以下方式致电:

 var output = drawProgress('O', new char[4] { 'S', 'O', 'B', 'O' }, new char[4] { '*', '*', '*', '*'});

output将为{'*', 'O', '*', 'O'}

答案 1 :(得分:2)

<。> .Net中的数组是引用类型。将引用类型传递给函数时,函数中会得到一个新变量,但它引用内存中的相同对象。这意味着你不必返回任何内容......传递给函数的原始文件将在最后保存正确的值。

你真正想做的是返回一个布尔值,以便知道是否添加到你的刽子手。

public bool checkProgress(char letterGuess, char[] wordToGuess, char[] displayString)
{
    bool result = false;
    for (int a = 0; a < wordToGuess.Length; a++)
    {
        if (wordToGuess[a] == letterGuess)
        {
            displayString[a] = letterGuess;
            result = true;
        }
    }
    return result;
}

var word = "hello world".ToCharArray();
var mask = word.Select(c => c==' '?' ':'*').ToArray();

Console.WriteLine(checkProgress('l', word, mask)); // will output "true"
Console.WriteLine(checkProgress('z', word, mask)); // will output "false"
Console.WriteLine(new string(mask)); // will output "**ll* ***l*"

如果您不理解某些语法,请不要担心:它只是设置一个快速测试,您可以将其放入控制台项目的主要功能中,以表明这是有效的。

作为免责声明,为了最终对函数参数语义有正确的理解,我需要再次提醒您,传递引用类型会在函数内部生成 new 变量。这意味着您在更改变量的属性(包括索引)时正在更改原始属性,但如果分配给变量本身,则表示变量指向不同的对象,并且原始变量不再受影响。这是一个简单的例子:

public class Foo
{
    public string text;
}

public void Test(Foo bar)
{
    bar.text = "hello";
    bar = new Foo(); //assigned to variable: it now referrs to a different object. original remains unchanged
    bar.text = "world";
}

var bar = new Foo();
bar.text= "";
Test(bar);
Console.WriteLine(bar.text); // will output "hello"

如果你将Foo声明为结构而不是类,这将使它成为一个值类型。如果你这样做,示例代码的输出将是原始的空字符串。另外,原因是学术性的,但你永远不应该设计一个具有你可以在构造后改变的属性的结构。如果类型包含可以变异的数据,则总是更喜欢类。