2016-11-13 2 views
0

現在のコードは、配列に保存された文字列を含むリストをループしています。現在、配列内のすべての文字列を検索します。私はこれを変更して、 "log [1]"内の文字列を検索(探している)するだけです。C# "配列[1]"内の文字列にキーワードが含まれている場合、配列全体を書き込む方法

申し訳ありませんが、私は "log [1]"という単語を知らないのです。私はプログラミングに新しい。読書を続けて、あなたが理解すると思います。

これは私がそれをしたい方法です:

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

項目[1]ログが[1]。私はlog [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ループの中で私は "item"を "item [1]"にするとmabyと思った。私のコードは "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

@ゴブン大丈夫これをループの代わりにスイッチで試して、結果を確認してください。あなたは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

内の文字列にアクセスできるように配列をループすることでした。アクセスしようとしているものが「新しい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); 
} 

はのは、それを印刷してみましょう:

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

によりToStringメソッドオーバーロードの出力には、素敵なを探します。

はのが何かを見つけてみましょう:私たちは、異なる Listクラスの methods、および LINQ拡張メソッドを使用することができます

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; 
     } 
    } 
} 
関連する問題