未能比较数组中的两个元素。rugs.Sort();//此句是错误的???
program : private void Form2_Load(object sender, EventArgs e)
        {
            Carpet c1 = new Carpet("Frieze" ,1 ,12);
            Carpet c2 = new Carpet("Saxony" , 2 , 9);
       
            ArrayList rugs = new ArrayList();
            rugs.Add(c1);
            rugs.Add(c2);
            rugs.Sort();
            Knapsack sack = new Knapsack(25);
            sack.fillSack(rugs);
            Console.Write(sack.getItems());                    }

解决方案 »

  1.   

     class MenCompare : IComparer
            {
                #region IComparer<men> Members            public MenCompare()
                {
                    
                }
                public int Compare(object manA, object manB)
                {
                   Carpet man1 = (Carpet)manA;
                   Carpet man2 = (Carpet)manB;
                    return man1.id.CompareTo(man2.id);
                }            #endregion
            }        public class Carpet
            {
                public int id;
            }
                Carpet c1 = new Carpet();
                Carpet c2 = new Carpet();
                c1.id = 2;
                c2.id = 1;
                ArrayList rugs = new ArrayList();
                rugs.Add(c1);
                rugs.Add(c2);            rugs.Sort(new MenCompare());
      

  2.   

    楼上正解, 如果相对对象进行排序 必须在类中实现IComparer 接口 的Compare方法
      

  3.   

    我的全部代码为
    namespace DelegateKnowledge
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void Form2_Load(object sender, EventArgs e)
            {
                Carpet c1 = new Carpet("Frieze" ,1 ,12);
                Carpet c2 = new Carpet("Saxony" , 2 , 9);
           
                ArrayList rugs = new ArrayList();
                rugs.Add(c1);
                rugs.Add(c2);
                rugs.Sort();
                Knapsack sack = new Knapsack(25);
                sack.fillSack(rugs);
                Console.Write(sack.getItems());                    }
        }    /// <summary>
        /// 地毯 carpet
        ///Thief  小偷
        ///背包  knapsack
        /// </summary>
        public class Carpet
        {
            private string item; //number
            private float val; // nums        private int unit;  // inits stock 
            
            public Carpet(string i, float v, int u)
            {
                item = i;
                val = v;
                unit = u;        }        public int compareTo(Carpet c)
            {
                return (this.val.CompareTo(c.val));
            }
             // set unit 
            public int getUnit()
            {
                return unit;
            }
            // set item members 
            public string getItem()
            {
                return item;
            }
            // set number nums to stocks 
            public float itemVal()
            {
                return val;        }
            //set units nums to sotcks
            public float getVal()
            {
                return val * unit;
            }        
        }    public class Knapsack
        {
            private float quantity;
            SortedList items = new SortedList();
            string itemlist;        public Knapsack(float max)
            {
               // float max;
                quantity = max;        }
            public void fillSack(ArrayList obj)
            {
                int pos = obj.Count - 1; //current position
                int totalUnits = 0; // total units nums
                int totalVal = 0; // nums 
                int tempTot = 0; // temp total units             while (totalUnits < quantity)
                {
                    tempTot += ((Carpet)obj[pos]).getUnit();//save unit nums to temp table 
                    if (tempTot < quantity)
                    {
                        //not items 
                        totalUnits += Convert.ToInt32(((Carpet)obj[pos]).getVal());//get total units to stocks 
                        items.Add(((Carpet)obj[pos]).getItem(), ((Carpet)obj[pos]).getUnit());// items ,units
                    }
                    else
                    {
                        //have items
                        float tempUnit = quantity - totalUnits;
                        float tempVal = ((Carpet)obj[pos]).itemVal() * tempUnit;
                        totalVal += Convert.ToInt32(tempVal);
                        totalUnits += (int)tempUnit;
                        items.Add(( (Carpet)obj[pos]).getItem() , tempUnit);                }
                    pos--;// counts change into smaller            }        }        //circle array inorder to get items units in items types 
            public string getItems()
            {
                foreach (object k in items.GetKeyList())
                {
                    itemlist += k.ToString() + " :" + items[k].ToString() + "";
                }
                return itemlist;        }
        }
     
    }
      

  4.   

            class MenCompare : IComparer 
            {         public MenCompare() 
                { 
                    
                } 
                public int Compare(object manA, object manB) 
                { 
                  Carpet man1 = (Carpet)manA; 
                  Carpet man2 = (Carpet)manB; 
                    return man1.itemVal().CompareTo(man2.itemVal()); 
                }             #endregion 
            }  private void Form2_Load(object sender, EventArgs e) 
            { 
                Carpet c1 = new Carpet("Frieze" ,1 ,12); 
                Carpet c2 = new Carpet("Saxony" , 2 , 9); 
          
                ArrayList rugs = new ArrayList(); 
                rugs.Add(c1); 
                rugs.Add(c2); 
                rugs.Sort(new MenCompare()); 
                Knapsack sack = new Knapsack(25); 
                sack.fillSack(rugs); 
                Console.Write(sack.getItems());                     }