我的主要问题是:如果我将“N”组添加到公司并在最后检查,我看到所有“男人”都安排在所有组中,就像在一起一样?
我的问题在于类或引用的定义。
这是我的代码:
public class Man
{
public int Code { get; set; }
public string Name { get; set; }
public int Priority { get; set; }
public int Stoptime { get; set; }
public Boolean Lunch { get; set; }
public DateTime Arrival { get; set; }
public DateTime Departure { get; set; }
public int LunchTime { get; set; }
}
public class Group
{
public List<Man> People { get; set; }
public double Speed { get; set; }
public double Rate { get; set; }
public double Surcharge { get; set; }
public double TotalRate { get; set; }
}
public class Company
{
public List<Group> Groups { get; set; }
public Group BestGroup { get; set; }
public double Rate { get; set; }
public double Surcharge { get; set; }
public double FullRate { get; set; }
}
private List<Man> ShufflePosts(List<Man> ShufflePeoples)
{
List<Man> Temp = ShufflePeoples;
List<Man> Commixed = new List<Man>();
Random rand = new Random();
do
{
int shf = rand.Next(0, Temp.Count);
Commixed.Add(Temp[shf]);
Temp.RemoveAt(shf);
} while (Temp.Count > 1);
Commixed.Add(Temp[0]);
return Commixed;
}
public void CAStart(List<Man> Peoples)
{
var _Race = new Company();
_Race.Groups = new List<Group>();
for (int i = 0; i < 5; i++)
{
var Gr = new Group();
Gr.People = ShufflePosts(Peoples);
_Race.Groups.Add(Gr);
}
}
在代码Commixed.Add(Temp[0]);
中,VS显示错误索引超出范围。
我检查变量并看到以下数据:
ShufflePeoples.Count = 0, Temp.Count = 0, Commixed.Count = 1
为什么会这样? 我的问题在哪里?
答案 0 :(得分:2)
为什么会收到错误:
do while
循环一直运行,直到Temp.Count > 1
不正确 - 当您使用第Temp.RemoveAt(shf);
行删除所有项目时,会发生这种情况。
然后你尝试访问Temp [0](第一项)但是temp为空,你得到一个index out of range
错误。
尝试更改循环条件,避免访问集合中的特定位置,而不检查该位置是否存在。或者更好的是仍然使用简单的时间,然后你不需要专门处理Temp
中的最后一项
一个很好的改组解决方案:
var suffled = ShufflePeoples.OrderBy(item => Guid.NewGuid());
答案 1 :(得分:0)
您删除了do-while
循环中的所有临时项目,因此当您尝试在循环后访问Temp[0]
时,它会为您提供index out of range
。
答案 2 :(得分:0)
更改循环以避免index out of range
错误:
while (Temp.Count > 0)
{
int shf = rand.Next(0, Temp.Count);
Commixed.Add(Temp[shf]);
Temp.RemoveAt(shf);
};
当您从Temp
移除项目时,也会将其从ShufflePeoples
中移除,因为您引用了Temp = ShufflePeoples
,为了避免它,只需创建新列表然后从ShufflePeoples
复制项目到Temp
。
答案 3 :(得分:0)
ShufflePosts
方法首次删除了ShufflePeoples
的所有内容。
因此,第二次运行ShufflePosts
方法,ShufflePeoples
或Temp' is basically empty, which means if you try to access
Temp [0]`时,它会为您提供超出范围的索引Exception。
我的2美分:
Temp = ShufflePeoples
,而是复制构造函数Temp = new List<Man>(ShufflePeoples)
,以确保不会意外调整参数