2016-11-13 3 views
0

현재 코드가 배열에 저장된 문자열을 포함하는 목록을 통해 반복됩니다. 현재 배열에서 모든 문자열을 찾습니다. "log [1]"내의 문자열을 검색 (찾고, 검색)하기 위해 이것을 변경하고 싶습니다.C# 배열 "1"내의 문자열에 키워드가 포함 된 경우 전체 배열을 쓰는 방법

죄송합니다. "log [1]"에 대한 단어는 모르겠다. 프로그래밍에 익숙하지 않습니다. 독서를 계속하면 이해할 것입니다.

이 내가 그것을 할 방법은 다음과 같습니다

foreach (string[] item[1] in loggbok) 

항목 [1] 인 로그 [1]. 로그 [1] 내에서만 검색하기 때문에 숫자 1이 매우 중요합니다.

이 내 목록의 전체 배열을 저장하는 내 현재 코드는 다음과 같습니다

List<string[]> loggbok = new List<string[]> { }; 
string[] log = new string[3]; //date, title, post 

DateTime date = DateTime.Now; 

log[0] = "\n\tDate: " + date.ToLongDateString() + " Kl: " + date.ToShortTimeString(); 
Console.WriteLine(log[0]); 

Console.Write("\tTitle: "); 
log[1] = "\tTitle: " + Console.ReadLine(); 

Console.Write("\tPost: "); 
log[2] = "\tPost: " + Console.ReadLine(); 

loggbok.Add(log); 
log = new string[3]; 

내가 저장

다음 코드 "[1] 로그인, 로그 [2], [3] 로그" 나는 내 목록을 거치고 로그 [1] 일명 제목 내의 모든 문자열을 인식하는 검색 기능을 만들고 싶습니다. 문자열 제목에 users 키워드가 포함되어 있으면 모든 로그가 결합되어 로그가 인쇄됩니다.

현재까지. 나는 모든 로그 (1,2,3)를 검색하여이를 해결했다. 즉, 내 프로그램에서 현재 제목, 날짜, 게시물 내의 문자열을 검색하고 있음을 의미합니다. 이렇게하면 제목 만 검색하여 사용자를 제한하려는 경우 메시지를 검색하거나 "게시"할 수 있습니다.

내 foreach 루프에서 "항목"을 "항목 [1]"로 만드는 경우 maby라고 생각했습니다. Will은 내 코드가 "log [1]"만을 찾도록합니다. "item [1]"이 (가) 유효하지 않은 구문이므로 작성하지 못했습니다.

현재 검색 기능 :

string key; 
Console.Write("\n\tSearch: "); 
key = Console.ReadLine(); 

//Searching through all log[] in loggbok. 
//I want to change this line to item[1] 
foreach (string[] item in loggbok) 
{ 
    //goes deeper and looks for all strings within log[]. 
    foreach (string s in item) 
    { 
     //if a string is found containing key word, this block will run. 
     if (s.Contains(key)) 
     { 
      foundItem = true; 
      Console.WriteLine(String.Join("\r\n", item)); 

      index++; 
     } 
    } 
} 
+0

괜찮습니까? – Gobban

+0

나는 텍스트의 벽을 쓰고 싶지 않았지만 어렸을 적 프로그래머에게는이 질문을하기 쉽게하기위한 올바른 단어를 모른다. 마비 이것은 광범위하고 만약 그렇다면 사과드립니다. 그러나 이것이 내 문제를 더 쉽게 이해할 수 있기를 바랍니다. – Gobban

+0

나는 또한 더 적절한 것으로 제목을 변경하려고 시도했다. 나는 C#에서 "log [1]"이라고 부르는 것을 모른다. 그것은 요소, 배열, arraymember입니까? 나는 모른다. 나는 그것이 무엇인지 불릴 때 이것을 편집 할 수있다. – Gobban

답변

0

은 아마 당신이 이런 식으로 작업을 수행 할 수 있습니다 당신은 심지어 루프 필요가 없습니다

var result = loggbok.FirstOrDefault(x=> x.Any(s=> s.Contains(key)); 

Console.WriteLine(result?? "No record found"); 
+0

내 코드와 비슷한 방식으로이 작업을 수행 할 수 있습니까? 프로그래밍에 익숙하지 않고 지식 기반을 벗어나면 혼란 스럽습니다. – Gobban

+0

@Gobban 좋아요. 이걸 루프 대신에 시도해보고 결과를보세요. 당신은 System.Linq이 필요합니다 – mybirthname

0

, 그래서 당신이해야 할 일에서 항목을 검색입니다 색인에 의해 loggbok.

// assign loggbokx of index 1, to variable item. 
string[] item = loggbok[1]; 
// item will then have the 2nd (index=1) logbook. 
// Note that index starts from 0. 
// If you want to have the first one, then it should be loggbox[0] 
// to make it even simpler you can write 
//  var item = loggbok[1]; 

// and the rest is the same... 

//goes deeper and looks for all strings within log[]. 
foreach (string s in item) 
{ 
    //if a string is found containing key word, this block will run. 
    if (s.Contains(key)) 
    { 
     foundItem = true; 
     Console.WriteLine(String.Join("\r\n", item)); 

     index++; 
    } 
} 
+0

나는 이것을 시도했지만 인덱스 [x]에서 문자열 만 제공합니다. 그렇지 않으면 좋게 들립니다. 간단하고 코드를 인식합니다. 내가 필요한 것은 if 문이 log [1] – Gobban

+0

문자열에 액세스 할 수 있도록 배열을 루프하는 것이 었습니다. "step into"에서 액세스하려고 시도하는 것을 "new System.Collections.Generic.Mscorlib_CollectionDebugView"라고합니다. (loggbok) .Items [0] [1] " – Gobban

0

하자!

은 로그에 대한 모델 클래스를 만듭니다

class LogEntry 
{ 
    public DateTime Date { get; set; } 
    public string Title { get; set; } 
    public string Post { get; set; } 

    public override string ToString() 
    { 
     return "Date: " + Date.ToLongDateString() + " Kl: " + Date.ToShortTimeString() 
      + "\tTitle: " + Title + "\tPost: " + Post; 
    } 
} 

이제 우리는 편안하게이 모델을 사용할 수 있습니다.

는 좀 더 레코드 목록을 채울 보자
List<LogEntry> loggbok = new List<LogEntry>(); 

for (int i = 0; i < 5; i++) 
{ 
    LogEntry entry = new LogEntry(); 
    entry.Date = DateTime.Now; 
    entry.Title = "title" + i; 
    entry.Post = "post" + i; 

    loggbok.Add(entry); 
} 

이 현실을 인쇄하자 다음 ToString 메서드 오버로드 출력이 좋은 밖으로 보이는

foreach (var entry in loggbok) 
    Console.WriteLine(entry); 

인해.

는의 무언가를 찾아 보자 : 우리는 다른 List 클래스의 methodsLINQ 확장 방법을 사용할 수 있습니다

string key = "title3"; 
var found = loggbok.Find(log => log.Title == key); 
Console.WriteLine("Found:\n" + found); 

.


데이터를 파일로 저장 한 다음 거기에서 읽을 필요가있는 경우 json 직렬화를 사용할 수 있습니다.

예를 들어, 사용하자 JavaScriptSerializer (어셈블리에 대한 참조를 추가하는 것을 잊지 마세요) : 사람이 intressting 발견하면

JavaScriptSerializer jss = new JavaScriptSerializer(); 

// Save 
File.WriteAllText("test.txt", jss.Serialize(loggbok)); 

// Load 
loggbok = jss.Deserialize<List<LogEntry>>(File.ReadAllText("test.txt")); 
0

이 솔루션입니다.

foreach (string[] item in loggbok) 
{ 
    foreach (string s in item) 
    { 
     //This was the magic line. 
     string searchTitle = item[1].ToLower(); 

     if (searchTitle.Contains(titleKey.ToLower())) 
     { 
     Console.WriteLine("\n\tSearch hit #" + index); 

     foundItem = true; 

     Console.WriteLine(String.Join("\r\n", item)); 

     index++; 

     break; 
     } 
    } 
}