2016-05-21 9 views
0

Ich habe mit diesem Code für eine Weile gekämpft, ich kann nicht herausfinden, wo ich falsch liege. Grundsätzlich möchte ich ein Array mit einem Integer durchsuchen und wenn es mit einem Element in diesem Array übereinstimmt, gibt es eine Bool-Variante als wahr zurück. Es ist ziemlich selbsterklärend, aber kann nicht für das Leben von mir herausfinden! Irgendwelche Ideen?Probleme mit meinem Code bei der Suche nach einem Element eines Arrays in C#

Hier ist der Code;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ArrayProject 
{ 
    class ArrayProgram 
    { 
     public bool ElementAt(int[] intArray, int valueToBeFound) 
     { 
      bool intAt = false; 
      int numberTofind; 

      Console.WriteLine("Please enter the number you wish to search for within the array: "); 
      numberTofind = Convert.ToInt32(Console.ReadLine()); 


      foreach (int x in intArray) 
      { 
       if (x == numberTofind) 
       { 
        intAt = true; 
       } 
       else 
       { 
        intAt = false; 
       } 
      } 
      if (intAt == true) 
      { 
       Console.WriteLine("{0} is in the array!", numberTofind); 
      } 
      else 
      { 
       Console.WriteLine("{0} is not in the array.", numberTofind); 
      } 

      return intAt; 
     } 
     public void RunProgram() 
     { 
      int[] intArray = { 20, 30, 40, 50, 60, 50, 40, 30, 20, 10 }; 
      int numberTofind = 0; 

      ElementAt(intArray, numberTofind); 

     } // end RunProgram() 

     static void Main(string[] args) 
     { 
      ArrayProgram myArrayProgram = new ArrayProgram(); 
      myArrayProgram.RunProgram(); 

      Console.WriteLine("\n\n==============================="); 
      Console.WriteLine("ArrayProgram: Press any key to finish"); 
      Console.ReadKey(); 
     } 
    } 
} 
+0

Was gibt der Code zurück? was erwartest du zu passieren? Ich könnte vorschlagen, die Schleife zu verlassen, wenn Sie Ihre Nummer finden .... –

+0

Was William Suggests ist richtig. Ich glaube nicht, dass Sie den richtigen Rückgabewert erhalten, weil die foreach-Schleife fortfährt, anstatt entweder zurückzukehren oder aus Ihrer Schleife auszubrechen. Es gibt auch die Contains und IndexOf, die Dmitriy erwähnt hat, die diese Berechnung für Sie tun werden. –

+0

Verwenden Sie eine Liste anstelle eines Arrays. Liste hat mehr Funktionalität: Liste IntArray = neue Liste () {20, 30, 40, 50, 60, 50, 40, 30, 20, 10}; int index = intArray.IndexOf (60); – jdweng

Antwort

1
 int[] intArray = { 20, 30, 40, 50, 60, 50, 40, 30, 20, 10 }; 
     int numberToFind = 0; 

     //variant 1 (using System.Linq): 
     bool bInside1 = intArray.Contains(numberToFind); 

     //variant2 
     bool bInside2 = Array.IndexOf(intArray, numberToFind) >= 0; 

Und wenn Sie möchten, dass Ihre eigene Funktion schreiben:

bool IsInside(int[] arrToSearch, int nToSearch) 
    { 
     foreach (int n in arrToSearch) 
     { 
      if (n == nToSearch) 
       return true; 
     } 
     return false; //not found 
    } 
+0

Danke! Versuche sie jetzt. –

1

Das Problem ist, dass Ihre Schleife wird fortgesetzt Elemente Überprüfung und Aktualisierung intAt auch wenn sie das Element findet Sie suchen . Wenn das Array {1, 2, 3, 4} war und Ihr Code nach 1 suchte, würde zuerst der Index 0 überprüft. Dies ist eine Übereinstimmung, so dass intAttrue wird. Als nächstes wird es versuchen Index 1. Dieser ist keine Übereinstimmung, also setzt er intAt auf falsch. Dann wird es versuchen, Indizes 2, 3, etc. nie finden die Übereinstimmung.

+0

Ooh! Das macht wirklich viel Sinn, also könnte ich eine Pause machen; zu dem Code, wenn er das Element findet? –

0

Wenn Sie Ihre Implementierung behalten möchten, versuchen Sie dies:

class ArrayProgram 
{ 
    public bool ElementAt(int[] intArray, int valueToBeFound) 
    { 
     foreach (int x in intArray)  
      if (x == valueToBeFound)  // if you found your value in the array 
       return true;    // you return true 

     return false; // otherwise, by this point the foreach has looped through all the elements and hasn't once entered in the above if (so it hasn't found your value) = you return false 
    } 

    public void RunProgram() 
    { 
     int[] intArray = { 20, 30, 40, 50, 60, 50, 40, 30, 20, 10,99 }; 
     int numberTofind; 

     // I noticed that you're not using the numberTofind value either, so: 

     Console.Write("Please enter the number you wish to search for within the array: "); 
     numberTofind = Convert.ToInt32(Console.ReadLine()); 

     // and since you made a function that returns true if your value has been found, you might as well use it like this 

     if(ElementAt(intArray, numberTofind)) // if the function returns true 
      Console.WriteLine("{0} is in the array!", numberTofind); 
     else 
      Console.WriteLine("{0} is not in the array.", numberTofind); 
    } // end RunProgram() 

    static void Main(string[] args) 
    { 
     ArrayProgram myArrayProgram = new ArrayProgram(); 
     myArrayProgram.RunProgram(); 

     Console.WriteLine("\n\n==============================="); 
     Console.WriteLine("ArrayProgram: Press any key to finish"); 
     Console.ReadKey(); 
    } 
} 
+0

Danke! Dies machte es ein wenig klarer, da ich meinen vorhandenen Code verwenden konnte. Ich kann sehen, wo ich damit falsch gelaufen bin :) –

1

Sie tun könnte dies recht einfach mit Linq.

using System.Linq; 

public static string test(int[] numberArray, int find) 
{ 
      bool s = false; 
      numberArray.ToList().ForEach(x => { if (x == find) s = true; }); 
      return s ? "It contains it." : "Can't find it."; 
} 

Allerdings gibt es eine Methode dafür. Sie können .Contains mit einem Array verwenden, wie eine Person über mir gesagt hat.

+0

> numberArray.ToList(). ForEach (x => {if (x == finden) s = true;}); Der Weg, der geschrieben wird, ist das wie eine kurze Hand für die Programmierung? Alles, was ich gelernt habe, sind die langen Handversionen. –

+0

Es ist eine Linq-Methode. Im Grunde eine komprimierte Syntax. Es ist das gleiche wie eine foreach-Schleife. Keine Leistungssteigerung. – xplatinumx15