如何在for循环方法中打印多个值?

时间:2015-12-14 05:38:15

标签: c# for-loop

我希望控制台为每个没有特殊falseitem(afaerie_charm)的盟友为代码中的每个盟友写一个.25

 public bool aFaerie_Charm()
    {
        var allylist = new List<Obj_AI_Hero>();
        allylist.AddRange(HeroManager.Allies);
        bool z = false;
        for (int i = 0; i < allylist.Count; i++) //allylist.count = 4
        {
            z = Items.HasItem((int)ItemId.Faerie_Charm, allylist[i]);
        }
        return z;
    }

在上面的代码中,如果列表中的任何盟友(4个盟友)都有'faerie_charm',则z为真,否则为false。

现在,在代码的这一部分:allylist[1](盟友2)有一个特殊的项目,所以bool返回true,然后faerie = .25;a2mrs()返回{ {1}},但这是问题:

代码发现其中一个盟友拥有该项目.25,但我不知道哪个盟友拥有它,它不会返回'ally 2 has item,它的值是.25',这就是问题。需要建议或帮助。

.25

输出:.25

问题:从输出.25,我只知道其中一个盟友有项目,我不知道哪个有项目。 摘要:如何重新编写代码,以便打印出类似的内容:

 public double a2mrs()
    {
        double faerie = 0;


            if (aFaerie_Charm() == true)
            {

                faerie = .25;
            }

        return faerie;
    }
static void Main(String[] args)
{
Console.WriteLine(a2mrs())
}

4 个答案:

答案 0 :(得分:0)

你的第一种方法会返回派对中的最后一个人是否有一个仙境的魅力,而不是是否有人。您可能需要重构您的方法,以便它们返回每个盟友的信息。您可以通过将第一种方法更改为

来完成此操作
public List<bool> aFaerie_Charm()
{
    var allylist = new List<Obj_AI_Hero>();
    allylist.AddRange(HeroManager.Allies);
    List<bool> z = new List<bool>();
    for (int i = 0; i < allylist.Count; i++) //allylist.count = 4
    {
        z.Add(Items.HasItem((int)ItemId.Faerie_Charm, allylist[i]));
    }
    return z;
}

然后打印:

public void printHasFaerieCharm()
{
    List<bool> charms = aFaerieCharm();
    for (int i = 0; i < charms.Count; ++i)
    {
        Console.WriteLine("Ally " + (i + 1) + ": " + (charms[i] ? ".25" : "false"));
     }
}

但是,我建议您调整第一种方法,这样它就会获取您要检查的项目的参数并使用它,这样您就可以在需要其他项目的相同信息时重复使用它。您可以使用第二种方法执行类似的操作来更改找到项目时打印的内容(以及要查找的项目),或者甚至将该信息添加到项目的类中(因此它将被称为类似printWhoHasItem(ItemId.FaerieCharm)的内容看起来像"ally i: " + ItemId.Message)。

答案 1 :(得分:0)

这个代码在各个方面都是错误的。您是否意识到aFaerie_Charm()的结果始终是从数组中检查最后一个盟友的结果?

首先不能在该代码阶段将双音素与双音混合。您需要决定其中一个(根据您的使用案例)并在需要时进行解释。

你需要从aFaerie_Charm()返回Dictionary并在那个词典中为你的数组中的每个盟友添加KeyValuePair,其中Key是该盟友的名字,Boolean是true或false。或者你可以让aFaerie_Charm接受ally的输入参数并为该特定盟友返回布尔值。

最后,你循环遍历该词典并解释你想要显示的布尔值。

在Linq,你会做那样的事情:

// Create dictionary, keys are names of allies, values says if that particular ally has "charm" or not
Dictionary<String, Boolean> allyData = (from x in HeroManager.Allies select new { Name = x.Name, HasCharm = Items.HasItem((int)ItemId.Faerie_Charm, x) }).ToDictionary(y => y.Name, z => z.HasCharm);

现在显示:

// Loop through dictionary
foreach (KeyValuePair<String, Boolean> a in allyData)
{
    // Display ally's name and if that ally has "charm" then print ".25" and print "false" otherwise 
    Console.WriteLine("%s = %s", a.Key, (a.Value ? ".25" : "false"));
}

答案 2 :(得分:0)

您可以在方法中再添加一行,如下所示:

    public bool aFaerie_Charm()
    {
        var allylist = new List<Obj_AI_Hero>();
        allylist.AddRange(HeroManager.Allies);
        bool z = false;
        for (int i = 0; i < allylist.Count; i++) //allylist.count = 4
        {
            z = Items.HasItem((int)ItemId.Faerie_Charm, allylist[i]);
            //You got 'z' now print  a line
            Console.WriteLine("Ally " + (i + 1) + ": " + z ? ".25" : "false");
        }
        return z;
    }

答案 3 :(得分:-1)

嗯,你可以做到这一点

  • 在aFaerie_Charm方法中,而不是bool返回int
  • 如果HasItem返回true,则if块中的aFaerie_Charm方法返回true,然后返回index(i)值,否则返回-1。
  • 现在在你的a2mrs方法中检查它是> 0还是小于0
  • 因此,如果&gt; 0然后你有索引值,所以你可以使用它。

    但是在aFaerie_Charm方法中猜测你需要在for循环中使用一个break语句。请检查