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导引头死亡
您可以使用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