首页 > 解决方案 > 我应该更改什么以确保我的代码将显示所需的输出?

问题描述

所以,我的代码有一个小问题,我认为这可能是由于 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。我应该修改什么以获得我想要的输出,当口袋妖怪准备好进化时,它应该只显示一行而不是重复的行。

标签: c#loopsforeach

解决方案


我会按名称对神奇宝贝进行分组。这也为您提供了与 具有相同名称的神奇宝贝的数量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;
    }
}

但这可以通过向类添加NoToEvolveEvolveTo(等等)属性来改进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在神奇宝贝进化时更改新旧神奇宝贝类型。


推荐阅读