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

本文关键字:数组 然后 返回 迭代 | 更新日期: 2023-09-27 18:08:29

家庭作业:我正在设计一款单人游戏。

我有一个数组(名为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

我最初认为这是一个范围问题,但评论者的解释并非如此。。。。

所以。。。如果我的返回范围内,是什么导致了错误?我错过了什么?

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

.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*"

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

作为免责声明,为了让您最终正确理解函数参数语义,我需要再次提醒您,传递引用类型会导致函数中出现新的变量。这意味着,当更改变量的属性(包括索引(时,您正在更改原始对象,但如果分配给变量本身,则会告诉变量指向不同的对象,而原始对象不再受影响。这里有一个快速的例子:

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声明为一个结构而不是一个类,这将使其成为一个值类型,那么这一切都将迎刃而解。如果要这样做,那么示例代码的输出将是原始的空字符串。另一方面,原因是学术性的,但你永远不应该设计一个结构,它的属性可以在构造后更改。如果类型具有可以变异的数据,则始终首选类。

    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'}