foreach (Label c in list_所有Label)
          {
              if (c.Text == "99099")
              {
                  i = list_所有Label.BinarySearch(c); //报错,未进行比较
                  MessageBox.Show(i.ToString());
                  break;
              }
          }list_所有Label是所有label的集合,当label的Text属性为99099时,用BinarySearch方法获得该label的索引值
为什么报错呢?

解决方案 »

  1.   

    你那什么命名哦还带汉字你用for循环比较好的
      

  2.   

    援引MSDN中的说明
    List<T>.BinarySearch(): 此方法使用类型 T 的默认比较器 Comparer.Default 确定列表元素的顺序。Comparer.Default 属性检查类型 T 是否实现了 IComparable 泛型接口,如果实现了该接口,则使用该实现。否则,Comparer.Default 将检查类型 T 是否实现了 IComparable 接口。如果类型 T 未实现任一接口,则 Comparer.Default 将引发 InvalidOperationException。

    你的代码里,Label没有实现比较子接口,所以会出错。
      

  3.   

     label.cont..看看那个是否存在
      

  4.   

    Label没有实现IComparable或者IComparable(Of T)接口。
      

  5.   

    BinarySearch二分查找,实现的是IComparer接口,是不是楼上各位看错了二分查找得是从小到大有序的,不然得不到结果大概是这样的,跟中间的一个对象比较,如果小,从左边接着取中间的对象比较,如果大,就从右边首先实现IComparer  public class Compare : IComparer
            {
                public int Compare(object x, object y)
                {
                    if (x is Label && y is Label)
                    {
                        return (x as Label).Text.CompareTo((y as Label).Text);
                    }
                    else
                    {
                        throw new Exception("类型不对");
                    }
                }
            }这里我是按照Label的Text,想按照其他属性比较也是可以的回到你的代码
       Compare com = new Compare();foreach (Label c in list_所有Label)
       {
       if (c.Text == "99099")
       {
       i = list_所有Label.BinarySearch(c,com);
       MessageBox.Show(i.ToString());
       break;
       }
       }
    注意:必须是从小到大有序
      

  6.   

    public class Compare1 : IComparerCompare1 com = new Compare();
    改一下,写重名了
     
      

  7.   

    我调试了下你的代码,主要是因为没有实现IComparable或者IComparable(Of T)接口,我的实现方法如下.
    自定义一个LabelMy控件.继承Label,并实现 IComparable 接口,如下.public partial class LabelMy : Label, IComparable
        {
            public LabelMy()
            {
                InitializeComponent();
            }
            protected override void OnPaint(PaintEventArgs pe)
            {
                // TODO: 在此处添加自定义绘制代码
                // 调用基类 OnPaint
                base.OnPaint(pe);
            }        #region IComparable 成员        public int CompareTo(object obj)
            {
                if (this.Equals(obj)) return 1;
                else return 0; 
            }
            #endregion
        }编译调试下成功后,工具箱中出现你自定义的LabelMy 控件 ,现在我在窗体中拖上N个LabelMy 控件,窗体加载时,把这些自定义LabelMy控件添加到List 集合中.这时的LableMy 已经实现了.IComparable 接口,不会再报这样的错误了.
    代码贴出如下:        private void Form1_Load(object sender, EventArgs e)
            {
                int i = 0;
                List<LabelMy> list = new List<LabelMy>();
                foreach (LabelMy var in this.Controls)
                {
                    if (var is LabelMy)
                        list.Add(var);
                }
                //foreach (LabelMy c in list)
                //{
                //if (c.Text.Equals("labelMy1"))
                //{
                i = list.BinarySearch(this.labelMy1); 
                MessageBox.Show(i.ToString());
                //break;
                //    }
                //}
            }