当前位置:编程学习 > C#/ASP.NET >>

请问,这个List的查询方法为什么报错

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的索引值
为什么报错呢? --------------------编程问答-------------------- --------------------编程问答-------------------- 等待答案 --------------------编程问答-------------------- 你那什么命名哦

还带汉字

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

你的代码里,Label没有实现比较子接口,所以会出错。 --------------------编程问答-------------------- 頂頂頂!!! --------------------编程问答-------------------- label没实现IComparable --------------------编程问答-------------------- --------------------编程问答-------------------- 路过!!!!!! --------------------编程问答-------------------- 惊现中文编程! --------------------编程问答-------------------- 易语言的合体!!! --------------------编程问答--------------------  label.cont..看看那个是否存在
--------------------编程问答-------------------- Label没有实现IComparable或者IComparable(Of T)接口。 --------------------编程问答-------------------- 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;
   }
   }
注意:必须是从小到大有序 --------------------编程问答-------------------- 路过........ --------------------编程问答-------------------- public class Compare1 : IComparer

Compare1 com = new Compare();
改一下,写重名了
  --------------------编程问答-------------------- 我调试了下你的代码,主要是因为没有实现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;
            //    }
            //}
        }

补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,