我应该更改什么以确保我的代码将显示所需的输出?

问题描述

所以,我的代码一个小问题,我认为这可能是由于 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 类添加 EvolveToPokemon(等等)属性来改进。然后你可以简单地写

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