C# 2D 数组匹配并返回 1 维

C# 2D Array Match and Return 1 Dimension

提问人:mapface 提问时间:5/24/2021 最后编辑:mapface 更新时间:5/24/2021 访问量:112

问:

我有一个 [Name, Code] 格式的 2D 字符串数组,其中 Code 是一个大写字母。我想根据“代码”的匹配返回数组中的所有“名称”,以增加我需要根据用户输入执行此操作的复杂性,直到输入哨兵值。

示例:array = [Fred, X],[Bryan, Y],[Angus,X],用户输入为“X”,想要返回 Fred 和 Angus。我的尝试——

        string CodeInput;
        const string STOP = "999";

        Write("\nEnter a Code or 999 to stop >> ");
        CodeInput = ReadLine();

        do
        {
            for (int Name = 0, Code =1; Name < array.GetLength(0); Name++)
            {
                if (CodeInput == array[Name,Code])
                {
                    for (int NameB = 0; NameB < array.GetLength(0); NameB++)
                        WriteLine(array[NameB, 0]);
                }
                else
                {
                    Write("\nIncorrect code");
                }
                Write("\nEnter a Code or 999 to stop >> ");
                CodeInput = ReadLine();
            }
        }
        while (CodeInput != STOP);
    }

匹配结果会列出所有名称,而不仅仅是匹配。我明白为什么它不起作用 - 第一个数组循环找到一个匹配项,然后第二个只是吐出所有名称 - 但我不知道如何让它工作。是的,这是家庭作业,我希望能够使用字典而不是数组,但不幸的是不是一个选项。

C# 组多 维数组 匹配 do-while

评论

0赞 Rubidium 37 5/24/2021
示例代码中缺少数组声明...它是基于您自己的选择的 2D,还是基于家庭作业要求?在第一种情况下,我会重新声明为一对数组(可能是自定义结构或 KeyValuePair<,>);在后一种情况下,缺少一些信息,因为那样的话,我不明白如何使用代码作为键。
0赞 mapface 5/25/2021
这是一个较大代码段的示例,对不起,我错过了包含声明的内容。不幸的是,2D 数组是一个要求(或任何类型的数组,但我现在已经致力于 2d,回想起来是一个糟糕的决定?
0赞 Rubidium 37 5/25/2021
为什么选择2D?您是否有由 2 个不同的、不相关的键编制索引的数据?这种索引的一个例子是国际象棋/棋盘,其中你有一个数字索引和一个字母索引,它们的组合指向一个单一的图块,你可以在其中找到你的唯一对象(游戏棋子)。请注意,在棋盘中,所有索引键都是唯一的。相反,在你的解释中,“X”和“Y”似乎更像是属性(即人物的姓氏或建筑物的楼层,您可以在其中找到几个人),它们可以用来查找物品,但不能唯一地标识它们。

答:

1赞 John Doe 5/24/2021 #1

第二个循环吐出所有的名字,因为这正是你要求他做的事情。

for (int NameB = 0; NameB < array.GetLength(0); NameB++)

   WriteLine(array[NameB, 0]);

等同于显示所有名称。

您要做的是:

do
{
    // Flag to indicate that you've found at least one match.  
    bool isFound = false;
    for (int Name = 0, Code = 1; Name < array.GetLength(0); Name++)
    {
        if (CodeInput == array[Name, Code])
        {
            Console.WriteLine(array[Name, 0]);
            isFound = true;
        }
    }
    // If no matches found - display message 
    if (!isFound)
    {
        Console.Write("\nIncorrect code");
    }
    // Moved out of cycle, so it won't be asked every iteration.
    Console.Write("\nEnter a Code or 999 to stop >> ");
    CodeInput = Console.ReadLine();
}
while (CodeInput != STOP);