所以我想学习元素周期表,但是我想对一个游戏进行编程(它将是一个控制台窗口)。所以第一个代码是元素的类,这很容易...
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代替了“数字”,这毫无疑问是索引,我将其放入手动操作,但我仍然有超出范围的异常...为什么?
答案 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 中调用索引。