2017-04-26 4 views
-1

私はプログラミングの初心者です。配列をループして要素のすべての出現を見つける方法C#

私はお互いに対応する2つの配列を持っています。 最初には生徒の名前が表示され、もう一方の生徒には生徒の等級が表示されます。

私の目標は、配列をループして、たとえばグレード 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)); 
    } 
+0

あなたが最初の一致を検出した後、すぐに返すので、それは停止します。他の配列(または 'List ')で見つかったすべてのインデックスを保存して保存し、その配列またはリストを返す必要があります。 – Steve

+0

あなたは1つの結果が見つかるとすぐに戻ります。むしろコードを変更して結果をリストに追加し、その結果に基づいて配列を生成します。次に出力メソッドに渡します。また、このために別の配列を持つことは賢明ではなく、基本的なオブジェクト指向のメソッドをよく学び、データを含むクラスを作成してください。この方法では、不一致の配列をこれまでに取得することはありません。 –

+0

"関連する"データの並列配列は、通常、良い考えではありません。データを "関連付ける"より良い方法は、それらを 'class Student {}'に入れることです。次に 'class'の配列を取得するだけです。 – crashmstr

答えて

0

まず、問題を述べましょう。我々は2つの配列を持っています:

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

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

あなたは与えられた等級のすべての生徒を取得したいと思います。例えば。 "Amy"および"Charly"80です。 それはあなたが両方の配列をスキャンする必要があなたの場合なら:

private static List<string> Search(string[] studentName, int[] studentGrade, int grade) { 
    List<string> result = new List<string>(); 

    // Let's use good old for loop instead of Linq 
    for (int i = 0; i < studentGrade.Length; ++i) 
    if (studentGrade[i] == grade) 
     result.Add(studentName[i]); 

    return result; 
} 

public static void ShowResults(int userInput) { 
    Console.WriteLine(); 
    Console.WriteLine("The following students have that grade: "); 
    Console.WriteLine(); 

    List<string> list = Search(studentGrade, studentName, userInput); 

    if (list.Count <= 0) 
    Console.WriteLine("{0} is NOT in array", userInput); 
    else 
    Console.WriteLine("{0} {1}", string.Join(", ", list), userInput); 
} 
+0

ドミトリーのお手伝いをありがとうございます。 –

+0

@Casey Smith:あなたは大歓迎です! –

0

LINQのは、それのために完全である:

var choosenGrades = studentGrade.Where(x=>x == userInput).ToList(); 

あなたは添字の最初のインスタンスを返すとしているので、あなたのループが1より後に終了さSystem.Linq

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)); 
      } 
     } 
} 
1

良いプログラミングは認知的負荷を軽減する技術であるように、あなたの結果を示す機能がなければなりません。あなたのアーキテクチャでは、プログラマは、両方の配列が互いに関連していることを知っています。次のような学生のクラスを作成する場合:

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

は今、あなたはこの時点で

var students = new List<Student>(); 

を作成することができ、コンパイラは、学生の名前と自分の成績を関連付けるために知っている、とあなたがする必要はありませんどの配列が相関しているかを覚えておく。

あなたは今のようなSystem.Linqのを使用して、フィルタリングされたリストを返すことができます。

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

あなたは認知的負荷が減少しています。これはあなたの例にとっては些細かもしれませんが、他の人のコードを維持するために大部分の時間を費やす大規模な組織では良いプログラミングの中心になります。

関連する問題