无法从对象列表列表中打印项目

时间:2017-05-20 22:47:20

标签: c# list

我有一项任务,要求我创建产品和服务并将它们添加到包(列表)中。然后将每个包添加到包列表中。

我设法创建了一个服务和一个产品的包,但我打印列表时遇到问题,因为它会打印每个包中的所有项目的次数与包装一样多(例如,如果我添加3个包,它将打印每个产品和服务3次)。我很难为该做什么。

我运行了调试器,它显示q in p foreach正在运行4次而不是2次,但我不知道如何解决这个问题。

以下是Package类的代码:

public class Package : AbstractProduct,IPackageble, IEnumerable, 
{

    public static List<AbstractProduct> package_elements = new List<AbstractProduct>();

    public bool canAddToPackage(Package package)
    {
        return false;
    }

    public void Add_element(AbstractProduct elem)
    {
        package_elements.Add(elem);
    }

 public override string Description()
    {
        foreach (AbstractProduct f in package_elements)
        {
            String var = " ";
            var = prod.Description();
        }
        return var;
    }

AbstractProductManager类:

public abstract class AbstractProductMgr
{
    //The general list

    protected static List<Package> elements = new List<Package>();

    public static void WriteToConsole()
    {
        foreach(Package p in elements)
        {
          foreach (AbstractProduct q in p)
            {
                Console.WriteLine(q.Description());
            }
        }
    }

AbstractProduct是一个抽象类,它定义了产品/服务的属性以及列出它们的虚拟Description方法。该类由ServiceProduct类继承,它们使用任何特定属性覆盖Description方法。

产品/服务是在键盘中的自己的经理类中读取的。 PackageMgr类调用产品/服务的插入方法,并将它们添加到Package列表,然后将Package列表添加到Elements列表。

2 个答案:

答案 0 :(得分:1)

你有:

public static List<AbstractProduct> package_elements = new List<AbstractProduct>();

表示package_elements类的所有实例之间共享Package。您可能想要松开static修饰符:

public List<AbstractProduct> package_elements = new List<AbstractProduct>();

答案 1 :(得分:1)

  

我运行了调试器,它显示p foreach中的q运行4次而不是2次但我不知道如何解决这个问题。

删除内部循环,因为Package类将遍历其所有项目并打印它们。我评论了它。

foreach(Package p in elements)
{
        // foreach (AbstractProduct q in p)
        //{
        Console.WriteLine(p.Description());
      //  }
}

您还应该将package_elements设为私有,否则可以从外部添加内容。