c#计算文本文件中相同的字符串

本文关键字:字符串 计算 文本 文件 | 更新日期: 2023-09-27 18:20:21

我有一个foreach语句,其中我遍历了文本文件中的几行,并对所需的行进行了修剪和排序。我想做的是计算一个相同字符串出现的次数。我该怎么做?

这是我的密码。这是我陷入困境的第二个if语句:

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

以下是一些线路的样子:

一袋硬币

一杯siog白兰地

一袋硬币

一袋硬币

Cath Shield

破旧的卷轴

所以我想做的是用一袋硬币数出三行。但我需要让它成为一切,有一个巨大的下拉列表。所以不能添加所有的它们,需要很长的

编辑

    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]siog探索者死了!

[01:09:55]你获得3687564点经验值。(1638917营地奖金)

[01:10:31]你施放了一个较小的毁灭爆发法术!

[01:10:31]你击中了siog导引头,造成424(+18)的伤害!

[01:10:31]索格人扔下一袋硬币。

[01:10:31]你得到了18块银和88块铜。

[01:10:31]siog导引头死亡

c#计算文本文件中相同的字符串

您可以使用LINQ来获取重复行数。这将创建一个字典,其中包含作为key的字符串以及该字符串作为value出现的次数。

var lineCountDict = lines.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());

要读出值,只需遍历字典即可。因此,使用示例列表

List<String> lines = new List<string>()
     { 
         "a bag of coins",
         "a siog brandy",
         "a bag of coins",
         "a bag of coins",
         "the Cath Shield",
         "a tattered scroll"
     };
var lineCountDict = lines.GroupBy(x => x).ToDictionary(x => x.Key, x => x.Count());
foreach (var val in lineCountDict)
{
     Console.WriteLine(val.Key + " - " + val.Value);
}

这将输出每个字符串以及它出现的次数,包括那些只出现一次的字符串。如果您只想要那些重复的,您可以通过添加Where子句来修改LINQ查询

var lineCountDict = lines.GroupBy(x => x).Where(x => x.Count() > 1).ToDictionary(x => x.Key, x => x.Count());

在您的示例中,字典将只有列表中的一个项目(a bag of coins),键将为a bag of coins,值将为3,因为它出现了3次。

基于评论的更新

这应该适用于您的情况

List<string> modifiedList = new List<string>();
int numberOfDrops = 0;
foreach (string line in lines.Where(l => l.Length >= 5))
{
     string ad = line.Remove(0, 11);
     if ((ad.Contains(mobName) && ad.Contains("dies")))
     {
        mobDeathCount++;
     }
     if (ad.Contains(mobName) && ad.Contains("drops"))
     {
         string lastpart = ad.Substring(ad.LastIndexOf("drops"));
         string modifiedLastpart = lastpart.Remove(0, 6);
         modifiedList.Add(modifiedLastpart);
         numberOfDrops++;
     }
}
double deathDropRatio = (double)mobDeathCount / (double)numberOfDrops;
var lineCountDict = modifiedList.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);
}

我喜欢使用Dictionary。

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

字符串是字典的键,每个字符串出现的次数就是值。

(免责声明:未测试代码;可能需要进行小调整。)

我想这就是你想要的:

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

如果你想找出所有行数组中有多少个字符串匹配(我的意思是-"字符串一"出现2次-"字符串二"出现4次),请在foreach外部创建一个字典,foreach内部的第一件事是:

Dictionary<string, int> same = new Dictionary<string, int>();
foreach (string line in lines)
{
      if (same.ContainsKey(line))
          ++same[line];
      else
          same.Add(line, 1);
      //......
      //do your other stuff
}

每个重复的字符串都会在dictionary的值中更新(字典中会记录所有字符串以及它们出现的次数),这样你就可以检查某个字符串出现的次数。

也许这会对您有所帮助,它是一个统计集合中所有重复字符串的代码pice。你必须修改它以适应你的需要,但希望你能抓住要点。

   var allStrings = new  List<string>{"stringOne", "stringOne", "stringTwo", "stringOne", "stringThree", "stringTwo"};
   var allStringsGrouped = allStrings.GroupBy(i => i);
   foreach (var group in allStringsGrouped)
   {
       System.Diagnostics.Debug.WriteLine(group.Key +" occured " + group.Count() + " times");
   }

输出如下:

stringOne occured 3 times
stringTwo occured 2 times
stringThree occured 1 times