如何在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
。
我最初认为这是一个范围问题,但评论者的解释并非如此。。。。
所以。。。如果我的返回范围内,是什么导致了错误?我错过了什么?
你真正想做的是返回一个布尔值,这样你就知道是否添加到你的刽子手中。
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'
}