我对C#来说还很陌生,我一直想解决一个问题,但现在已经解决了一段时间。我必须从菜单中为不同类型的食物创建类,并从控制台输入字段的值。问题在于输入将包含每种食物类型的未知计数,因此我决定使用一个List来存储不同类型的汤,在这种情况下为汤。
这是食物类别之一的代码:
public class Soup : Food
{
public List<Soup> soups = new List<Soup>();
public Soup(string name, double grams, decimal price) : base(name, grams, price)
{
}
}
下面的代码来自调用类。我正在接收来自用户的输入,但是我仍然想访问列表,因此可以向其中添加另一个元素。如果有人可以给我一些指导,以便从调用列表的Soup类中访问列表,以便我可以添加新元素,我将不胜感激。
int countProducts = int.Parse(Console.ReadLine());
char[] delimeters = new char[] { ',', ' ' };
CultureInfo cultures = new CultureInfo("en-US");
for (int i = 0; i < countProducts; i++)
{
string[] inputProductInfo = Console.ReadLine().ToLower().Split(delimeters, StringSplitOptions.RemoveEmptyEntries).ToArray();
if (inputProductInfo[0] == "soup")
{
Soup soup = new Soup(inputProductInfo[1], Convert.ToDouble(inputProductInfo[2], cultures), Convert.ToDecimal(inputProductInfo[3], cultures));
}
}
基本,我需要将soup
关联到soups
列表,但是当我尝试以下代码时soups.Add(soup)
,我得到
名称“汤”在当前上下文中不存在错误。
编辑:如果有人在一段时间后遇到相同的问题,请保留此编辑。我检查了以下两个建议,两个都为我工作。但是,我选择了li223的第二种建议方式,因为它正是我想要的。更改代码的技巧也很有用。
您需要以某种方式引用其他对象的列表。您不能只输入成员的姓名。有两种方法可以做到这一点。
通常:您可以将Soup类中的List设置为静态,这将使您可以执行Soup.soups
public class Soup : Food
{
public static List<Soup> soups = new List<Soup>();
}
var mysoup = new Soup(/*removed for brevity*/);
Soup.soups.Add(mysoup);
或者您可以在您的Soup类中创建实例并以这种方式访问该成员,这几乎就是您已经做的事情:
public class Soup : Food
{
public List<Soup> soups = new List<Soup>();
}
var mysoupobj = new Soup(/*data*/);
mysoupobj.soups.Add(soup);
编辑:
[只需要注意,您的Soup
类的每个实例也将包含其自己的List<Soup>
。我个人建议您更改代码,以使Soup
中的列表位于其他位置,以便Soup
的每个实例都不会有空的List<Soup>
可能〜静态成员方法最有意义,但是从问题描述中还不清楚。
您只需要使Soup从构造函数中添加到静态列表中,那么您就不必担心从外部添加它;添加创建的每个汤!
public class Soup : Food
{
public static List<Soup> soups = new List<Soup>();
public Soup(string name, double grams, decimal price) : base(name, grams, price)
{
soups.Add(this);
}
}
然后通过以下方式访问您的列表:
Soup.soups.xxx();