[英]Getting Index out of range exception
我的主要問題是:如果我將“ N”個組添加到公司中並在最后一次檢查,我會看到所有“ 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.RemoveAt(shf);
。
然后,您嘗試訪問Temp [0](第一項),但是temp為空,並且得到index out of range
錯誤。
嘗試更改循環的條件,並避免訪問集合中的特定位置,而不檢查該位置是否存在。 或者最好還是使用一小段時間,然后您就不需要專門處理Temp
的最后一項
一個很好的改組解決方案:
var suffled = ShufflePeoples.OrderBy(item => Guid.NewGuid());
您可以在do-while
循環中刪除所有Temp項,因此,當您嘗試在循環后訪問Temp[0]
,它將使index out of range
。
更改循環以避免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
。
這是第一次, ShufflePosts
方法將刪除的所有內容ShufflePeoples
。 因此,第二次運行ShufflePosts
方法時, ShufflePeoples
或Temp' is basically empty, which means if you try to access
Temp [0]`,它將使索引超出Exception范圍。
我的2美分:
Temp = ShufflePeoples
,而是執行Copy Constructor Temp = new List<Man>(ShufflePeoples)
,以確保您不會意外調整參數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.