c# - 我应该更改什么以确保我的代码将显示所需的输出?
问题描述
所以,我的代码有一个小问题,我认为这可能是由于 foreach 循环,但如果我在其中设置一个中断,它将不再转到另一个 else if 块这是一个问题。因此,如果可能的话,我希望得到您的帮助。
这是我的代码 - 循环。
foreach (Pokemon p in pokemons)
{
if (p.Name == "pikachu" || p.Name == "Pikachu")
{
if (pikacount >= pikaNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + pikaEvolveTo);
}
}
else if (p.Name == "eevee" || p.Name == "Eevee")
{
if (eveecount >= eeveeNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + eeveeEvolveTo);
}
}
else if (p.Name == "charmander" || p.name == "Charmander")
{
if (charmcount >= charNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + charEvolveTo);
}
}
}
如果条件满足,输出应该是这样的
Pikachu -> Raichu
Charmander -> Charmeleon
Eevee -> Flareon
但相反,我的输出是这样的,因为它循环遍历列表
Pikachu -> Raichu
Pikachu -> Raichu
Charmander -> Charmeleon
Eevee -> Flareon
Eevee -> Flareon
Eevee -> Flareon
我的口袋妖怪列表目前包含 3 个 Eevee、2 个皮卡丘和 1 个 Charmander。条件是,如果口袋妖怪本身有这么多数量,那么它就有资格进化。例如,如果我的列表中有两个皮卡丘,它将有资格进化并被展示。但是,现在由于它循环遍历列表,它将列出 Pikachu -> Raichu 两次,因为我的列表中有 2 个 pikachu。我应该修改什么以获得我想要的输出,当口袋妖怪准备好进化时,它应该只显示一行而不是重复的行。
解决方案
我会按名称对神奇宝贝进行分组。这也为您提供了与 具有相同名称的神奇宝贝的数量g.Count()
。因此,您不必单独计算这些数字。
var groups = pokemons
.GroupBy(p => p.Name.ToLower());
foreach (var g in groups) {
switch (g.Key) { // Key is the Name in lower case since we grouped by it.
case "pikachu":
if (g.Count() >= pikaNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + pikaEvolveTo);
}
break;
case "eevee":
if (g.Count() >= eeveeNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + eeveeEvolveTo);
}
break;
case "charmander":
if (g.Count() >= charNoToEvolve)
{
Console.WriteLine(p.Name + "-->" + charEvolveTo);
}
break;
}
}
但这可以通过向类添加NoToEvolve
和EvolveTo
(等等)属性来改进Pokemon
。然后你可以简单地写
var groups = pokemons
.GroupBy(p => p.Name.ToLower());
foreach (var g in groups) {
Pokemon p = g.First();
if (g.Count() >= p.NoToEvolve)
{
foreach (Pokemon pEvolve in g.Take(p.NumEvolve)) {
Console.WriteLine(pEvolve.Name + "-->" + pEvolve.EvolveTo);
pEvolve.Name = pEvolve.EvolveTo;
}
}
}
如果游戏仅基于文本,那么您可能没有特定于单个神奇宝贝的数据。如果它是一个图形游戏,那么你至少有每个人的坐标。
如果您只有特定于神奇宝贝类型的数据,那么每个神奇宝贝类型只有一个对象会更容易。该类Pokemon
(现在更好地称为PokemonType
)将具有一个Count
属性,告诉存在多少这种类型的神奇宝贝。
这将使处理更容易。无需计数,无需分组,无需转换神奇宝贝等。仅Count
在神奇宝贝进化时更改新旧神奇宝贝类型。
推荐阅读
- sql-server - 从日期范围中获取两个日期之间的 DAYs 数据
- sql-server - 无法打开登录请求的数据库“dataname”。登录失败。用户登录失败
- javascript - Javascript过滤器选择而不是复选框
- html - 为什么我的填充仅在元素处于悬停状态时显示?
- algorithm - 谷歌键盘使用哪种算法进行自动建议(包括个人词汇)?
- html - 为什么引导类 d-sm-none 仍然在小屏幕上显示图像
- hibernate - 如何隐藏或屏蔽由 Hibernate 的 API 生成的记录器(数据库连接详细信息)
- android - 从 Lottie 获取的自定义动画的 ContentLoadingProgressBar 行为
- .net - 从函数应用服务的代码中加载证书
- powershell - 方法调用失败,因为 X 不包含名为“op_Subtraction”的方法