如何管理多个不断增长的列表?
How do I manage multiple growing lists?
程序首先收集游戏中 allied/enemy 个小兵的数量。
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);
}
}
}
}
这应该有效
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.The !emd.Any() ? -1 :如果列表为空,将强制为 -1;
2.The Select 将每个 int 元素投影到具有两个属性的匿名类型:Value 和 Index;
3.The聚合将得到具有最小值的元素;
4.Finally,我们得到所选元素的索引。
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
你可以轻松找到它!
var minIndex = emd.IndexOf(emd.Min());
程序首先收集游戏中 allied/enemy 个小兵的数量。
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);
}
}
}
}
这应该有效
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.The !emd.Any() ? -1 :如果列表为空,将强制为 -1;
2.The Select 将每个 int 元素投影到具有两个属性的匿名类型:Value 和 Index;
3.The聚合将得到具有最小值的元素;
4.Finally,我们得到所选元素的索引。
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
你可以轻松找到它!
var minIndex = emd.IndexOf(emd.Min());