获取索引超出范围异常
本文关键字:范围 异常 索引 获取 | 更新日期: 2023-09-27 17:54:21
我的主要问题是:如果我将"N"组添加到company并在最后检查它,我看到所有的"Man"都被安排到所有的组中,就像在一起?
我的问题在于类或引用的定义。
这是我的代码:
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
为什么会这样?
为什么你得到错误:
你的do while
循环运行,直到Temp.Count > 1
不为真-这将发生当你从Temp.RemoveAt(shf);
行删除所有项目。
然后你尝试访问Temp[0](第一项),但Temp是空的,你得到一个index out of range
错误。
尝试改变循环的条件,避免访问集合中的特定位置而不检查该位置是否存在。或者最好还是使用一个简单的while,这样你就不需要专门处理Temp
一个很好的洗牌解决方案:
var suffled = ShufflePeoples.OrderBy(item => Guid.NewGuid());
更改循环以避免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
。
您删除了do-while
循环中的所有Temp项,因此当您尝试在循环后访问Temp[0]
时,它将为您提供index out of range
。
第一次,ShufflePosts
方法将删除ShufflePeoples
的所有内容。因此,第二次运行ShufflePosts
方法,ShufflePeoples
或Temp' is basically empty, which means if you try to access
Temp[0] '时,它会给你index out of range Exception。
My two cents:
- 避免分配
Temp = ShufflePeoples
,而不是复制构造函数Temp = new List<Man>(ShufflePeoples)
,以确保您不会意外调整参数 - 总是检查你的参数参数的初始条件。