【问题标题】:Getting Index out of range exception获取索引超出范围异常
【发布时间】:2016-07-04 08:05:26
【问题描述】:

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

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

【问题讨论】:

  • 顺便说一句 - 下次通过你得到的错误询问 - 然后你会找到this question
  • 你试过调试你的代码吗?

标签: c# list class


【解决方案1】:

为什么会出现错误:

您的 do while 循环一直运行到 Temp.Count &gt; 1 不正确 - 当您使用行 Temp.RemoveAt(shf); 从中删除所有项目时会发生这种情况。

然后您尝试访问 Temp[0](第一项),但 temp 为空并且您收到 index out of range 错误。

尝试更改循环的条件并避免在未检查该位置是否存在的情况下访问集合中的特定位置。或者最好还是使用一个简单的 while,这样你就不需要专门解决 Temp 中的最后一项了


一个很好的洗牌解决方案:

var suffled = ShufflePeoples.OrderBy(item => Guid.NewGuid());

【讨论】:

  • 为什么不将项目添加到“混合”以及为什么将项目删除到 ShufflePeoples
  • 我不明白你的意思。希望我回答正确。当您将项目添加到Commixed 时,您不会得到它,因为您首先选择了一个肯定在兰特中的位置。一个更好的方法就是给你一个简单的While 循环。这样,您之后就不需要处理集合中的最后一项。
【解决方案2】:

更改循环以避免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】:

    您删除了do-while 循环中的所有 Temp 项,因此当您尝试在循环后访问Temp[0] 时,它会给您index out of range

    【讨论】:

    • 为什么不将项目添加到“混合”以及为什么将项目删除到 ShufflePeoples
    【解决方案4】:

    ShufflePosts 方法第一次将删除ShufflePeoples 的所有内容。 因此第二次运行ShufflePosts 方法,ShufflePeoplesTemp' is basically empty, which means if you try to accessTemp[0]`,它会给你索引超出范围异常。

    我的 2 美分:

    1. 避免分配Temp = ShufflePeoples,而是使用Copy Constructor Temp = new List&lt;Man&gt;(ShufflePeoples),以确保不会意外调整参数
    2. 始终检查参数参数的初始条件。

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多