我有一个
以下是一些行的示例:
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);
}
以下是一些行的示例:
一袋硬币
一瓶西欧白兰地
一袋硬币
一袋硬币
卡斯盾牌
一张破旧的卷轴
所以我想要做的是计算有3行写着“一袋硬币”。但我需要让它可以适用于所有内容,有一个很大的下拉列表。所以不能把它们都加进去,那样会花费太长时间。
编辑
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] Siog搜寻者掉落了一袋硬币。
[01:09:55] Siog搜寻者掉落了一瓶Siog白兰地酒。
[01:09:55] Siog搜寻者死亡!
[01:09:55] 你获得了3,687,564点经验值。(1,638,917个营地奖励)
[01:10:31] 你施放了一个较小的解除附魔爆发法术!
[01:10:31] 你对Siog搜寻者造成了424 (+18)点伤害!
[01:10:31] Siog搜寻者掉落了一袋硬币。
[01:10:31] 你拾取了18个银和88个铜硬币。
[01:10:31] Siog搜寻者死亡。
mobDropCount++
就足够了 - 但我怀疑你对掉落物品的计数感兴趣,对吗?为此,请考虑使用 Dictionary<string,int>,其中掉落物品的名称是键,而次数是值。还可以在 SO 上搜索“C# 频率图”或“C# 直方图”,因为许多方法都会使用 Dictionary。 - user2246674