2017-04-19 7 views
0

私はこのコードを数日前に作成し、かなり簡単な質問をしました。私はこのような質問が尋ねられたことを知っていますが、私の場合に特に役立つものは何も見つかりませんでした。ケース3の検索機能をあまり複雑でない検索方法に変更したいので、基本的にはリニア検索に置き換えたいと思っています。それが不可能な場合、私は線形探索をどこか別の場所に実装したいと考えています。あなたたちには手がかりがありますか?すべての助けに感謝します。ケース3でc#、プログラムをリニア検索に変更する

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

必要以上にここで多くのコードがあります - あなたがしたい部分だけにそれをトリミングすることができます単純化するには? –

+0

関連する唯一の部分は 'var entries = loggbok.Where(')で始まる行のようですが、検索はかなりシンプルに見えますが、単純化したいものは –

+0

この部分のプログラムはこのようになります。エラーが発生しています:割り当てられていないローカル変数loggの使用 – mackanmorre

答えて

1

あなたのキーワード検索は、すでに線形です。スイッチ内で検索文をあまり冗長にしたくないだけですか?そして、関数に検索式を回し:

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

とswitch文でそれを呼び出す:

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

ヘルパー関数の素晴らしい点は、いつかは、遅い線形検索の代わりにキーワードインデックスを使用するように切り替えることができ、メインプログラムはすべて、それはちょうど速くなるでしょう。 –

関連する問題