簡體   English   中英

使索引超出范圍異常

[英]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方法時, ShufflePeoplesTemp' is basically empty, which means if you try to access Temp [0]`,它將使索引超出Exception范圍。

我的2美分:

  1. 避免分配Temp = ShufflePeoples ,而是執行Copy Constructor Temp = new List<Man>(ShufflePeoples) ,以確保您不會意外調整參數
  2. 始終檢查參數參數的初始條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM