一组面板:1,2,3,4
如果在窗体已加载面板1,接着只可以加载面板2,3,4;
如果在窗体已加载面板1,3,接着必须先加载面板2,然后加载面板4;
如果在窗体已加载面板1,2,4,接着只可以加载面板3;

解决方案 »

  1.   


    用一个数组 A 存放四个面板的加载状态,
    A[0] ,面板数
    A[1] ,1面板
    A[2] ,2面板
    A[3] ,3面板
    A[4] ,4面板当别的地方加载面板时,设置相应的标记
    for(int i=1;i<A.Length;i++)
    {
       if( A[i] == 0) 未加载
       {
           //加载面板
            A[i] = 0;
       }
    }这样的话,别的面板别加载时,面板没有被加载的,一定会被加载,而且序号小的一定先加载,
      

  2.   

    int a=0,b=0,c=0,d=0,sum=0;
    if(面板1已加载) a=1;
    if(面板2已加载) b=2;
    if(面板3已加载) c=4;
    if(面板4已加载) d=8;
    sum=a+b+c+d;
    switch(sum)
    {
     case 1:加载2,3,4;break;
     case 5:加载2再加载4;break;
     case 11:加载3;break;
     default: break;
    }
      

  3.   

    switch一下不就可以了?
    这也叫算法?
      

  4.   

    container
    if(container.contain(面板1)&&!container.contain(要加的面板))
    {
    if(container.count==1)
    {
    container.add(要加的面板);
    }
    else if(container.count==2&&container[1]==3)
    {
    container.add(面板2);
    }
    else
    {
    container.add(要加的面板);
    }
    }
      

  5.   

    class TPanel
            {
                private string _id;
                public TPanel(string id)
                {
                    _id = id;
                }            private bool _isLoaded;
                public bool IsLoaded
                {
                    get { return _isLoaded; }
                    set { _isLoaded = value; }
                }
            }        private void LoadAllPanel()
            {
                TPanel [] panels = new TPanel[5]();
                for (int i = 0; i < panels.Length; i++)
                {
                    panels[i] = new TPanel("panel_" + i);
                }
                //...do something            if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){
                    LoadPanel(panels);
                }
                else if (panels[1].IsLoaded && panels[3].IsLoaded)
                {
                    LoadPanel(panels);
                }
                else if (panels[1].IsLoaded)
                {
                    LoadPanel(panels);
                }
            }
            private void LoadPanel(TPanel[] p)
            {
                for (int i = 1; i < p.Length; i++)
                {
                    if (!p[i].IsLoaded)
                    {
                        LoadPanel(p[i]);
                    }
                }
            }
            private void LoadPanel(TPanel p)
            {
                //...do something...
                p.IsLoaded = true;
            }
    实际上,写完后就会发现,下面这一段执行的效果等同于,直接调用  LoadPanel(panels);。
    对于剩下未加载的面板,按下标顺序加载。if(panels[1].IsLoaded && panels[2].IsLoaded && panels[4].IsLoaded){
                    LoadPanel(panels);
                }
                else if (panels[1].IsLoaded && panels[3].IsLoaded)
                {
                    LoadPanel(panels);
                }
                else if (panels[1].IsLoaded)
                {
                    LoadPanel(panels);
                }
      

  6.   


    没明白是什么意思你的意思是你有无穷个面板?
    要不不会存在什么正无穷大的问题。。
    1,2,3,4任意的组合都可以通过abcd的和来表示。。
      

  7.   

    最小的面板循环到最大的面板,找出是null的面板,实例化。
      

  8.   

    面板应该多不到哪吧
    就用switch好了
      

  9.   

    动态加载条件。
    使用xml文件存储你的那些的条件。
    比如
    .........
    <condition>
    <if>
      <panel id=1>
    </if>
    <then>
      <panel id=2>
      <panel id=3>
      <panel id=4>
    </then>
    </condition>
    .......创建实体类
    class panel
    {
       string id;
       ....
    }
    class condition
    {
       ArrayList<panel> if;
       ArrayList<panel> then;
    }将xml里的condition标签全部加载到实体类中剩下的,把你的预想的条件,和condition里的if里的内容进行比较,一致,那就运行then所指代的所有面板;不一致,就和下一个condition进行比较。这里无穷个条件是不可能的,ArrayList,或者说C#数组也有限制的,最多只能做到随机条件的和结果的一个搭配算法。
      

  10.   

    个人认为比较简单,一下是代码,希望有用
     class PannelAdd
        {        public void DoAdd()
            {
                List<int> added = new List<int>();
                List<int> source = new List<int>();
                List<int> neededToAdd = new List<int>();            for (int i = 1; i < 11; i++)
                {
                    if (i % 3 == 0)
                    {
                        //模拟获取已经加载的pannel到AddedList
                        added.Add(i);
                    }
                    //模拟有哪些Pannel
                    source.Add(i);
                }            //在所有pannel中排除已经加载的,得到需要加载的
                foreach (int value in source)
                {
                    if (added.Contains(value) == false)
                    {
                        neededToAdd.Add(value);
                    }
                }            //按你的要求来看,所有需要加载的是按从小到大加载,所以这里排序
                neededToAdd.Sort();            //模拟你的加载过程
                StringBuilder target = new StringBuilder();
                foreach (int value in neededToAdd)
                {
                    //用于模拟向窗体加载面板
                    target.AppendLine(value.ToString());
                }
                //模拟加载结果
                Console.WriteLine(target.ToString());        }
        }