如何循环遍历数组以查找元素C#的所有实例

时间:2017-04-26 19:32:08

标签: c# arrays loops console-application

我对编程很陌生,

我有两个相互对应的数组。 第一个显示学生姓名,另一个显示学生成绩。

我的目标是遍历阵列并打印出所有具有成绩的学生 例如87。

截至目前,我能够打印出该等级的第一个人,但是一旦找到一年级,循环就会结束。

我无法弄清楚如何找到所有这个年级的人。任何帮助,将不胜感激。感谢

     public static void OptionTwo()
    {
        LoadArray();

        Console.WriteLine("Enter a student grade to see all students with that grade");
        int userInput = Convert.ToInt32(Console.ReadLine());

        int subscript;

        subscript = Search(studentGrade, userInput, ref counter);
        ShowResults(userInput, subscript, counter);
    }

    public static int Search(int[] studentGrade, int userInput, ref int counter)
    {
        counter = 0;

        for (int s = 0; s < studentGrade.Length; s++)
        {
            counter++;                             

            if (studentGrade[s] == userInput)
                return s;
        }
        return -1;
    }

    public static void ShowResults(int userInput, int subscript, int counter)
    {

        //LOOP THROUGH ARRAY
        Console.WriteLine();
        Console.WriteLine("The following students have that grade: ");
        Console.WriteLine();

            if (subscript == -1)
                Console.WriteLine("{0} is NOT in array, # of comparisons is {1}",
                    userInput, counter);
            else
                Console.WriteLine("{0} {1}", studentName[subscript].PadRight(20), studentGrade[subscript].ToString().PadRight(5));
    }

4 个答案:

答案 0 :(得分:1)

良好的编程是减少认知负荷的艺术。在您的架构中,您 - 程序员 - 知道两个阵列彼此相关。如果您创建一个Student类:

public class Student
{
    public string Name;
    public int Grade;
}

现在你可以创建一个

var students = new List<Student>();

此时,编译器知道要关联学生姓名和成绩,并且您不必记住哪些数组是相关的。

您现在可以使用System.Linq返回已过滤的列表:

return students.Where(x => x.Grade == 87);

你减少了认知负担。对于您的示例而言,这似乎微不足道,但它对于大型组织中的良好编程至关重要,您将花费大部分时间来维护其他人的代码。

答案 1 :(得分:0)

Linq非常适合它:

add_editor_style()

请务必添加导入 var choosenGrades = studentGrade.Where(x=>x == userInput).ToList();

答案 2 :(得分:0)

你的循环在一个之后结束的原因是因为你正在返回下标的第一个实例并且函数在那里结束。

您应该创建一个要返回的下标列表。

所以你应该将搜索功能改为这样的

public static List<int> Search(int[] studentGrade, int userInput, ref int counter)
    {
        var listOfSubscripts = new List<int>();
        counter = 0;

        for (int s = 0; s < studentGrade.Length; s++)
        {
            counter++;                             

            if (studentGrade[s] == userInput)
                listOfSubscripts.Add(s);
        }

        return listOfSubscripts;
    }

然后你的节目结果函数应该像

public static void ShowResults(int userInput, List<int> subscripts, int counter)
{

    //LOOP THROUGH ARRAY
    Console.WriteLine();
    Console.WriteLine("The following students have that grade: ");
    Console.WriteLine();

        if (subscript == -1)
            Console.WriteLine("{0} is NOT in array, # of comparisons is {1}",
                userInput, counter);
        else
        {
            foreach(var subscript in subscripts)
            {
                Console.WriteLine("{0} {1}", studentName[subscript].PadRight(20), studentGrade[subscript].ToString().PadRight(5));
            }
        }
}

答案 3 :(得分:0)

首先,让我们说明问题。我们有两个数组:

 string[] studentName = new string[] {
   "Amy", "Bob", "Charly", "Dimitry", "Eva",
 };

 int[] studentGrade = new int[] {
   80, 70, 80, 95, 68,         
 }; 

并且您希望得到所有具有给定成绩的学生。例如。 "Amy"的{​​{1}}和"Charly"。 如果是你的情况,你必须扫描两个阵列:

80