【问题标题】:How do I manage multiple growing lists?如何管理多个不断增长的列表?
【发布时间】:2016-04-06 14:36:04
【问题描述】:

程序首先收集游戏中友方/敌方小兵的数量。

 var eminions = MinionManager.GetMinions(Player.ServerPosition, 1500 MinionTypes.All, MinionTeam.Enemy).ToList();
 var aminions = MinionManager.GetMinions(Player.ServerPosition, 1500, MinionTypes.All, MinionTeam.Ally).ToList();

然后我使用一个函数将列表中的每个对象转换为距离:

 emd.Add(eminions[0].ServerPosition.Distance(aminions[i].ServerPosition)); //the count is 5

我们的列表 'emd' 包含 (aminions.Count) 距离,在我们的示例中 = 5。

emd[0] = 500
emd[1] = 400
emd[2] = 300
emd[3] = 200
emd[5] = 100

这就是棘手的地方,我们想找出最小距离在列表中的位置。如果我们推理,我们可以看到它是 emd[5] = 100。但是我如何得到“5”?

总结:程序必须在列表中找到最小的数,然后得到它在列表中找到它的位置。

这是我尝试过的:我尝试比较每个数字以查看最小的数字,如果为真,添加到新列表中,我面临的问题是我创建了太多列表并且我不准备处理不同数量的奴才.

var eminions = MinionManager.GetMinions(Player.ServerPosition, 1500, MinionTypes.All, MinionTeam.Enemy).ToList();
var aminions = MinionManager.GetMinions(Player.ServerPosition, 1500, MinionTypes.All, MinionTeam.Ally).ToList();
if (eminions.Count > 0 && aminions.Count > 0)
{
    List<double> emd = new List<double>();
    List<bool> bdistance = new List<bool>();
    for (int i = 0; i < aminions.Count; i++)
    {
        emd.Add(eminions[0].ServerPosition.Distance(aminions[i].ServerPosition));

        for (int j = 0; j < aminions.Count; j++)
        {
            if (emd[i] > emd[j])
            {
                bdistance.Add(true);
            }
        }   
    }
}

【问题讨论】:

  • 标题很不合适。您正在寻找最小值的索引。那如何管理多个不断增长的列表?除此之外 - 我支持 cramopy 的答案是最好的 - 一个简单的循环。

标签: c# .net list min


【解决方案1】:
int pos = 0; // set index to zero
int min = emd[0]; // set minimum to first value
for (int i = 1; i < emd.Count; i ++)
{
    var val = emd[i]; // get value from position
    if (val < min) //check if value is smaller then current minimum
    {
        // set minimum to value
        min = val;
        // set minimum pos to current value pos
        pos = i;
    }
}
//found minimum
//minimum index == pos

【讨论】:

  • 您好,非常感谢您的贡献,我非常感谢,我认为这可以工作,但您可以添加 cmets 吗?我想逐步了解这个答案的心态,谢谢!!
  • 不需要最后的if - 它永远不会被击中。仅当emd 为空时,索引就是我们所说的-1(又名未找到),在这种情况下,一开始就会抛出异常(我认为这是合适的)。删除最后一个if,这是最好的答案。 Loop 比 Linq 好!
  • @adan-ramirez 为您添加了 cmets
  • @SimpleVar 删除了 if 语句,更改逻辑后忘记删除它...谢谢伙计!!
  • 是的,我会这样做(作为单独的方法编写)。
【解决方案2】:

您可以轻松找到它!

var minIndex = emd.IndexOf(emd.Min()); 

【讨论】:

    【解决方案3】:

    这应该可以工作

    int indexMin
        = !emd.Any() ? -1 :
        emd.Select( (value, index) => new { Value = value, Index = index } )
        .Aggregate( (a, b) => (a.Value < b.Value) ? a : b )
        .Index;
    

    1. !emd.Any() ? -1 :如果列表为空,则强制为 -1;

    2.Select会将每个int元素投影成一个匿名类型,具有两个属性:Value和Index;

    3.Aggregate 将获取具有最小值的元素;

    4.最后,我们得到所选元素的索引。

    【讨论】:

    • 您好,非常感谢您的贡献,我非常感谢,我认为这可以工作,但您可以添加 cmets 吗?我想逐步了解这个答案的心态,谢谢!!
    • 这是我使用“嗯,Linq 还是普通代码?”的代码示例。 ...“嗯。这个是正常的代码,我想。”
    • @Fernando '第一种方法的工作速度比第二种方法快 1000 倍'这是什么意思?解释
    • @adanRamirez 第二种方法首先获取花费 n 次迭代的最小值(检查所有数组),在找到该元素的索引后,也运行 throw all 数组。在 cramopies 解决方案的情况下,它需要 n 次迭代,因为它只生成一个 run throw 数组。
    • @adanRamirez 抱歉,快了两倍 :)
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2022-12-07
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多