2017-04-19 3 views
0

Ich habe diesen Code vor ein paar Tagen gemacht und habe eine ziemlich einfache Frage. Ich weiß, dass Fragen wie diese gestellt wurden, aber ich konnte nichts finden, was speziell für meinen Fall funktioniert. Ich möchte die Suchfunktion in Fall 3 in eine weniger komplexe Suchmethode ändern, also möchte ich sie grundsätzlich durch lineare Suche ersetzen. Wenn das nicht möglich ist, möchte ich die lineare Suche woanders implementieren. Habt ihr irgendwelche Hinweise? Alle Hilfe wird geschätzt.C#, Programm in lineare Suche ändern

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace Loggbok 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      DateTime tiden = DateTime.UtcNow;//Skriver ut tiden vid varje inlägg 
      bool running = true;//Ger ett booleskt värde till variabeln running för att kunna skapa en loop 
      List<string[]> loggbok = new List<string[]>();//Här skapas listan som innehåller arrayen 

     while (running)//Här skapas loopen 
     { 
      Console.WriteLine("\n************************************"); 
      Console.WriteLine("\nVälkommen till loggboken!"); 
      Console.WriteLine("\n************************************"); 
      Console.WriteLine("\n[1] Skriv nytt inlägg i loggboken"); 
      Console.WriteLine("[2] Skriv ut alla loggar"); 
      Console.WriteLine("[3] Sök inlägg i loggboken"); 
      Console.WriteLine("[4] Radera innehåll i loggboken"); 
      Console.WriteLine("[5] Avsluta loggboken"); 
      Console.WriteLine("\n************************************"); 
      Console.Write("\nVälj: "); 

      int option;//Int eftersom valet ska vara ett heltal 

      try 
      { 
       option = Int32.Parse(Console.ReadLine());//testar så att inmatningen är av typen Int 

      } 
      catch 
      { 
       Console.WriteLine("Fel, du får bara skriva in nummer");//Felmeddelande om inmatningen är en bokstav 
       continue; 
      } 

      switch (option) 
      { 
       case 1: 
        string[] logg = new string[2];//Här deklareras arrayen 
        Console.WriteLine("\n************************************"); 
        Console.WriteLine(tiden); 
        Console.WriteLine("Ange en Titel:"); 
        logg[0] = Console.ReadLine();//Här sparas titeln 
        Console.Clear(); 
        Console.WriteLine("\n************************************"); 
        Console.WriteLine("Skriv inlägg:"); 
        logg[1] = String.Format("{0}{1}{2}", Console.ReadLine(), Environment.NewLine, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));//Här sparas inlägget samt datum och tid, detta är möjligt tack vare formattering 
        loggbok.Add(logg); 
        break; 


       case 2: 
        foreach (string[] item in loggbok)//För att skriva ut alla items i loggboken 
        { 
         Console.WriteLine("\n--------------------------------------\n "); 
         Console.WriteLine(item[0]);//För att skriva ut titel 
         Console.WriteLine(item[1]);//För att skriva ut inlägg 
         Console.WriteLine("\n--------------------------------------\n "); 
        } 
        Console.ReadLine(); 
        break; 




       case 3: 

        Console.WriteLine("\n************************************"); 
        Console.WriteLine("Skriv in ett ord du vill söka efter i loggboken:"); 
        var nyckelord = Console.ReadLine();//Här sparas inmatningen av nyckelordet 
        var entries = loggbok.Where(entry => entry.Any(item =>item.IndexOf(nyckelord, StringComparison.OrdinalIgnoreCase) > -1));//För att kontrollera om nyckelordet finns samt ignorera skiftlägeskänslighet, och finna både titel och inlägg 
        foreach (var entry in entries)//för att finna alla inlägg/titlar som matchar nyckelord 
        { 
         Console.WriteLine("\n--------------------------------------\n "); 
         Console.WriteLine(string.Join(", ", entry));//Skriver ut titel samt inlägg som matchat nyckelordet 
         Console.WriteLine("\n--------------------------------------\n "); 
        } 
        if (entries.Count() == 0)//Om ingen matchning hittas 
        { 
         Console.WriteLine("\n--------------------------------------\n "); 
         Console.Write("Din sökning misslyckades...");//Felmeddelande om ingen matchning hittas 
         Console.WriteLine("\n--------------------------------------\n "); 
        } 
        break; 



       case 4: 

        Console.WriteLine("\n************************************"); 
        Console.WriteLine("Skriv titeln på det inlägg du vill ta bort:"); 
        string title = Console.ReadLine();//Sparar titeln på inlägget användaren vill radera 

        for (int x = 0; x < loggbok.Count; x++) //Loopa igenom varje titel 
        { 
         if (String.Equals(loggbok[x][0], title, StringComparison.OrdinalIgnoreCase)) //Icke skiftlägeskänslig matchning av titeln. 
         { 
          loggbok.RemoveAt(x); //Matchning funnen. 
         } 
         else 
         { 
          Console.WriteLine("Titeln finns inte, återgår till huvudmenyn"); 
         } 


        } 
        break; //Avsluta loopen. 


       case 5: 

        running = false;//Avslutar loopen och därmed programmet 
        break; 


       default: 

        Console.WriteLine("Nu blev det fel, välj mellan [1] [2] [3] [4] [5]");//Felmeddelande om valet är någon annan siffra än de som menyn innehåller 
        break; 









      } 
     } 
    } 
} 

}

+3

Es gibt viel mehr Code hier als nötig - können Sie sie trimmen sie nur auf den gewünschten Teil vereinfachen? –

+0

Der einzige nützliche Teil scheint die Zeile zu sein, die mit 'var entries = loggbok.Where (' beginnt. Die Suche sieht ziemlich einfach aus. Was willst du vereinfachen? –

+0

Ich möchte, dass das Programm in diesem Teil so aussieht Fehler, den ich bekomme ist: Verwendung von nicht zugewiesenen lokalen Variablen logg – mackanmorre

Antwort

1

Ihre Keyword-Suche in Fall 3 ist bereits linear. Versuchen Sie nur, die Suchanweisung innerhalb des Schalters weniger ausführlich zu machen? Dann drehen Sie den Suchausdruck in eine Funktion:

static IEnumerable<string[]> SearchByKeyword(IEnumerable<string[]> loggbok, 
    string nyckelord) { 
    return loggbok.Where(entry => entry 
    .Any(item => item.IndexOf(nyckelord, 
     StringComparison.OrdinalIgnoreCase) > -1)); 
} 

und rufen Sie es in der switch-Anweisung:

var entries = SearchByKeyword(loggbok, nyckelord); 
+0

Das Tolle an einer Hilfsfunktion ist, dass Sie eines Tages wechseln könnten, um einen Keyword-Index anstelle der langsamen linearen Suche zu verwenden, und das Hauptprogramm müsste nicht geändert werden alles, es würde nur schneller werden. –