2017-04-19 6 views
0

나는이 코드를 며칠 전에 작성했으며 꽤 간단한 질문을 가지고 있습니다. 이 질문에 답을 얻었지만 내 경우에는 특별히 작동하는 것을 찾을 수 없었습니다. 사례 3의 검색 기능을 덜 복잡한 검색 방법으로 변경하고자하므로 기본적으로 선형 검색으로 바꾸고 싶습니다. 그럴 수 없다면 다른 곳에서 선형 검색을 구현하고 싶습니다. 너희들 단서가 있니? 모든 도움을 주시면 감사하겠습니다. 경우 3C#, 프로그램을 선형 검색으로 변경

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

스위치 문에서 호출 :

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

도우미 기능에 대한 좋은 점은 언젠가 저속 선형 검색 대신 키워드 색인을 사용하도록 전환 할 수 있으며 주 프로그램은에서 변경하지 않아도된다는 것입니다. 모든 것이 더 빨리 진행될 것입니다. –