请问,这个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#