获取索引超出范围异常

本文关键字:范围 异常 索引 获取 | 更新日期: 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方法,ShufflePeoplesTemp' is basically empty, which means if you try to access Temp[0] '时,它会给你index out of range Exception。

My two cents:

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