超出范围但在范围内?

时间:2018-07-18 19:19:39

标签: c#

所以我想学习元素周期表,但是我想对一个游戏进行编程(它将是一个控制台窗口)。所以第一个代码是元素的类,这很容易...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PeriodicTableGame
{
    class Element
    {
        int AtomicNumber;
        double AtomicMass;
        string Name;
        int Period;
        int Group;
        bool isLanthanide;
        bool isActanide;
        int isMetal; // 0 = Non Metal, 1 = Metaloid, 2 = Metal
        int stateAtRT; // 0 = Solid, 1 = Liquid, 2 = Gas, 3 = Plasma (68     Degrees F, 20 Celcius, 293.15 Kelvin)

        int Block; // 0 = s, 1 = d, 2 = p, 3 = f

        public Element(int atomicNumber, double atomicMass, int period, int group, bool islanthanide, bool isactanide, int ismetal, int stateatrt, int block)
        {
            AtomicNumber = atomicNumber;
            AtomicMass = atomicMass;
            Period = period;
            Group = group;
            isLanthanide = islanthanide;
            isActanide = isactanide;
            isMetal = ismetal;
            stateAtRT = stateatrt;
            Block = block;
        }
    }

到目前为止,该代码块很好,现在是第二个代码块...

class Data
{
    public static List<Element> ElementList = new List<Element>();

    public static List<Element> AddToList()
    {
        Element Nothing = new Element(0, 0, 0, 0, false, false, 0, 0, 0);
        Element Hydrogen = new Element(1, 1.008, 1, 1, false, false, 0, 2, 0);
        Element Helium = new Element(2, 4.003, 1, 18, false, false, 0, 2, 0);
        Element Lithium = new Element(3, 6.94, 2, 1, false, false, 0, 0, 0);
        Element Beryllium = new Element(4, 9.012, 2, 2, false, false, 2, 0, 0);
        Element Boron = new Element(5, 10.81, 2, 13, false, false, 1, 0, 2);
        Element Test = new Element(0, 0, 0, 0, false, false, 0, 0, 0);
        ElementList.Insert(0, Nothing);
        ElementList.Insert(1, Hydrogen);
        ElementList.Insert(2, Helium);
        ElementList.Insert(3, Lithium);
        ElementList.Insert(4, Beryllium);
        ElementList.Insert(5, Boron);
        ElementList.Insert(6, Test);
        return ElementList;
    }
}

那个也不错,现在是第三个街区...

class NumberGenerator
{
    public static int RandomNumberGenerator(int Min, int Max)
    {
        Random RandomGen = new Random();
        int RandomGenChoice = RandomGen.Next(Min, Max + 1);
        return RandomGenChoice;
    }
    public static Element RandomElementGenerator(int Number)
    {
        Element x = Data.ElementList.ElementAt(Number);
        return x;
    }
}

    class Program
{
    static void Main(string[] args)
    {
        int RNG = NumberGenerator.RandomNumberGenerator(1, 5);
        Element y = NumberGenerator.RandomElementGenerator(RNG);
    }

(忽略本文中可能遗漏了一个括号的括号,但在Visual Studio中可以使用),我列出了一个元素列表(我从5开始,从1开始,然后是一个测试...),并尝试使用在它们上使用ElementGenerator,但是它给出了超出范围的异常,所以我使用了一个数组,这就是您要查看的内容,然后我使用数字1代替了“数字”,这毫无疑问是索引,我将其放入手动操作,但我仍然有超出范围的异常...为什么?

2 个答案:

答案 0 :(得分:1)

我建议您将此代码发布到Code Review,因为使用C#功能可以轻松完成几件事。

但是要解决问题...

Element y = NumberGenerator.RandomElementGenerator(i);

您确定在此输入的行与您在代码中的一样吗?因为如果确实是这样,我可以理解该错误:

Element y = NumberGenerator.RandomElementGenerator(j);  // j, not i

这是您的Main方法的作用:

static void Main(string[] args)
{
    // generate random number from 1 to 5
    int i = NumberGenerator.RandomNumberGenerator(5, 1);

    // print the number
    Console.WriteLine(i);

    // set j equal to (1 to 5) - 7 + 1 = (-6 to -1) [but this line is unused]
    int j = i - Data.ElementList.Count + 1;

    // Get an element in position -6 to -1
    Element y = NumberGenerator.RandomElementGenerator(j);

    // Wait for user to press a key
    Console.ReadKey();
}

如果我相信第四行是j,那么您正在尝试将元素放在-1到-6的位置,但是数组将只有0和正数位置。

您可以使用调试器找出Number包含的内容。收到异常后,将鼠标悬停在Number上以查看其值。在Visual Studio 2017中,它可能会自动向您显示此值。

答案 1 :(得分:0)

您正在呼叫一个空列表。 在调用索引之前,先通过 Data.AddToList()添加项目 Data.ElementList

    public static Element RandomElementGenerator(int Number)
    {
        Data.AddToList();
        Element x = Data.ElementList.ElementAt(Number);
        return x;
    }

然后,您可以在 Data.ElementList 中调用索引。

相关问题