问题描述
所以,我的代码有一个小问题,我认为这可能是由于 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。条件是,如果这只宝可梦拥有这么多数量的自身,那么它就有资格进化。例如,如果我的列表中有两个皮卡丘,它就有资格进化并显示出来。但是,现在由于它遍历列表,它将列出皮卡丘 - > Raichu 两次,因为我的列表中有 2 个皮卡丘。我应该修改什么以获得我想要的输出,当口袋妖怪准备好进化时,它应该只显示一行而不是重复的行。
解决方法
我会按名字对神奇宝贝进行分组。这也会为您提供与 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;
}
}
}
如果游戏仅基于文本,那么您可能没有特定于单个 Pokémon 的数据。如果是图形游戏,那么你至少有每个人的坐标。
如果您只有特定于 Pokémon 类型的数据,那么每种 Pokémon 类型只拥有一个对象会更容易。 Pokemon
类(现在更好地称为 PokemonType
)将有一个 Count
属性,表明存在多少这种类型的神奇宝贝。
这将使处理更容易。无需计数,无需分组,无需转换神奇宝贝等,只需在神奇宝贝进化时更改新旧神奇宝贝类型中的Count
即可。
你可以添加一个 bool 类型变量来保持状态是否已经创建了 pokemon。如果是第一次创建,只需将值更改为 true,下次不会再次打印。
此外,您可以使用 Equals1("someString",StringComparison.CurrentCultureIgnoreCase)
而不是两次比较 pokemon 名称。
var pikachuFound = false;
var eeveeuFound = false;
var charmanderFound = false;
foreach (Pokemon p in pokemons)
{
if (p.Name.Equals("pikachu",StringComparison.CurrentCultureIgnoreCase))
{
if (pikacount >= pikaNoToEvolve && !pikachuFound)
{
pikachuFound = true;
Console.WriteLine(p.Name + "-->" + pikaEvolveTo);
}
}
else if (p.Name.Equals("eevee",StringComparison.CurrentCultureIgnoreCase))
{
if (eveecount >= eeveeNoToEvolve && !eeveeuFound)
{
eeveeuFound = true;
Console.WriteLine(p.Name + "-->" + eeveeEvolveTo);
}
}
else if (p.Name.Equals("charmanderFound",StringComparison.CurrentCultureIgnoreCase))
{
if (charmcount >= charNoToEvolve && !charmanderFound)
{
charmanderFound = true
Console.WriteLine(p.Name + "-->" + charEvolveTo);
}
}
}