使索引超出范围异常

时间:2016-07-04 08:05:27

标签: c# list class

我的主要问题是:如果我将“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

为什么会这样? 我的问题在哪里?

4 个答案:

答案 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方法,ShufflePeoplesTemp' is basically empty, which means if you try to access Temp [0]`时,它会为您提供超出范围的索引Exception。

我的2美分:

  1. 避免分配Temp = ShufflePeoples,而是复制构造函数Temp = new List<Man>(ShufflePeoples),以确保不会意外调整参数
  2. 始终检查参数参数的初始条件。