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的索引值
为什么报错呢?
{
if (c.Text == "99099")
{
i = list_所有Label.BinarySearch(c); //报错,未进行比较
MessageBox.Show(i.ToString());
break;
}
}list_所有Label是所有label的集合,当label的Text属性为99099时,用BinarySearch方法获得该label的索引值
为什么报错呢?
List<T>.BinarySearch(): 此方法使用类型 T 的默认比较器 Comparer.Default 确定列表元素的顺序。Comparer.Default 属性检查类型 T 是否实现了 IComparable 泛型接口,如果实现了该接口,则使用该实现。否则,Comparer.Default 将检查类型 T 是否实现了 IComparable 接口。如果类型 T 未实现任一接口,则 Comparer.Default 将引发 InvalidOperationException。
你的代码里,Label没有实现比较子接口,所以会出错。
{
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;
}
}
注意:必须是从小到大有序
改一下,写重名了
自定义一个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;
// }
//}
}