3

foreachテキスト ファイルからいくつかの行を調べて、必要な行を切り詰めて整理したステートメントがあります。私がやりたいのは、同じ文字列が何回存在するかを数えることです。どうすればいいですか?

これが私のコードです。それifは私が立ち往生している2番目のステートメントです:

        foreach (string line in lines.Where(l => l.Length >= 5))
        {
            string a = line.Remove(0, 11);

            if ((a.Contains(mobName) && a.Contains("dies")))
            {

                mobDeathCount++;
            }
            if (a.Contains(mobName) && a.Contains("drops"))
            {
                string lastpart = a.Substring(a.LastIndexOf("drops"));
                string modifiedLastpart = lastpart.Remove(0, 6);

            }

いくつかの行は次のようになります。

コインの袋

シオグブランデー

コインの袋

コインの袋

キャスシールド

ぼろぼろの巻物

だから私がやろうとしているのは、コインの袋で3行あるカウントアップです。しかし、私はそれがすべてになるようにする必要があります。巨大なドロップリストがあります。そのため、em のすべてを追加することはできません。時間がかかりすぎます

編集

    private static void Main()
    {
        int mobDeathCount = 1;
        int lootCheckCount = 1;

        string[] lines =
            System.IO.File.ReadAllLines(@"C:\Users\Michael\Documents\Electronic Arts\Dark Age of Camelot\chat.log");
        Console.WriteLine(
            "Enter which mob you want to see, remember to include the, for an example; The siog seeker, remember to start with a capital T");
        string mobName = Console.ReadLine();


        foreach (string line in lines.Where(l => l.Length >= 5))
        {




            string a = line.Remove(0, 11);

            if ((a.Contains(mobName) && a.Contains("dies")))
            {

                mobDeathCount++;
            }
            if (a.Contains(mobName) && a.Contains("drops"))
            {
                string lastpart = a.Substring(a.LastIndexOf("drops"));
                string modifiedLastpart = lastpart.Remove(0, 6);

               var lineCountDict = modifiedLastpart.GroupBy(x => x).Where(x => x.Count() > 1).ToDictionary(x => x.Key, x => x.Count());
               foreach (var val in lineCountDict)
               {
                   Console.WriteLine(val.Key + " - " + val.Value);
               }

改行;

[01:09:55] シオグシーカーはコインの入った袋を落とします。

[01:09:55] シオグシーカーはシオグブランデーを落とします。

[01:09:55] シオグシーカーが死んだ!

[01:09:55] 3,687,564 の経験値を獲得します (1,638,917 キャンプ ボーナス)。

[01:10:31] レッサー ディスエンチャンティング イラプション スペルを唱えました!

[01:10:31] siog seeker に 424 (+18) のダメージを与えました!

[01:10:31] シオグシーカーはコインの入った袋を落とします。

[01:10:31] 銀18個と銅88個を拾います。

[01:10:31] シオグシーカーが死ぬ

4

5 に答える 5

3

これには辞書を使用するのが好きです。

Dictionary<string, int> dict = new Dictionary<string, int>();
foreach (string s in yourStringList) {
    if (dict.ContainsKey(s)) {
        dict[s] = ++dict[s];
    } else {
        dict[s] = 1;
    }
}

文字列が辞書のキーであり、それぞれの出現回数が値です。

(免責事項: コードはテストしていません。微調整が必​​要な場合があります。)

于 2013-06-27T19:14:48.420 に答える
1

これがあなたが望むものだと思います:

Dictionary<string, int> dropsDict = new Dictionary<string, int>();    

foreach (string line in lines.Where(l => l.Length >= 5))
{
     string a = line.Remove(0, 11);

     if ((a.Contains(mobName) && a.Contains("dies")))
     {
         mobDeathCount++;
     }

     if (a.Contains(mobName) && a.Contains("drops"))
     {
         string lastpart = a.Substring(a.LastIndexOf("drops"));
         string modifiedLastpart = lastpart.Remove(0, 6);

         if (dropsDict.ContainsKey(modifiedLastpart)) 
         {
             dropsDict[modifiedLastpart] = dropsDict[modifiedLastpart]++;
         } 
         else 
         {
             dropsDict[modifiedLastpart] = 1;
         }
     }
}
于 2013-06-27T19:28:17.037 に答える