C#如何通过Linq在listbox数据源(与List<;T>;绑定)中查找对象的索引

C#如何通过Linq在listbox数据源(与List<;T>;绑定)中查找对象的索引,c#,linq,listbox,C#,Linq,Listbox,我有这样一个viewmodel类: public class ViewItem { private No as int; private Name as string; ...Getter-Setter go here... } 我有一个列表框名称LbxItemBox 我将其与数据源绑定为: List<ViewItem> DataList; LbxItemBox.Datasource = DataList; 如何在LbxItemBox中找到这样的对象模型

我有这样一个viewmodel类:

public class ViewItem
{
    private No as int;
    private Name as string;

    ...Getter-Setter go here...
}
我有一个列表框名称LbxItemBox

我将其与数据源绑定为:

List<ViewItem> DataList;
LbxItemBox.Datasource = DataList;
如何在LbxItemBox中找到这样的对象模型索引:

ViewItem ViewX = new ViewItem();
ViewX.No = 3;
ViewX.Name = "John";
我试过简单的方法,而不是Linq:

int IndexMatched = LbxItemBox.Items.IndexOf(ViewX);
但返回-1

如何使用Linq查找所需内容的索引


感谢您的帮助

有几种方法可以实现这一点。首先,您可以覆盖ViewItem类的
Equals
。这将导致对ViewItem的新实例的IndexOf调用表明列表中已有的任何对象都相当于具有相同信息的新创建的对象。对于您的班级,您在这里列出了如何做到这一点:

public class ViewItem
    {
        private int No { get; set; }
        private string Name { get; set; }

        public ViewItem(int no, string name)
        {
            this.No = no;
            this.Name = name;
        }

       public override bool Equals(Object obj)
        {
            // Check for null values and compare run-time types.
            if (obj == null || GetType() != obj.GetType())
                return false;

            ViewItem other = (ViewItem) obj;
            return (No == other.No);
        }

    }
上面的示例应该返回正确的索引,因为Equals已被重写。有关正确实现Equals和GetHashCode的更多信息,请参阅或

如果不寻求真正的相等性,使用linq处理此问题的另一种方法是匹配ViewItem类的某些属性。下面是这样做的一个例子:

List<ViewItem> items = new List<ViewItem>() { new ViewItem(1, "John"), new ViewItem(2, "Jake"), new ViewItem(2, "Frank")};
var john = new ViewItem(1, "John");
var frankInd = items.FindIndex(i => i.Name == "Frank");
Console.WriteLine(items.IndexOf(john));
Console.WriteLine(frankInd);
List items=newlist();
var john=新视图项(1,“john”);
var frankInd=items.FindIndex(i=>i.Name==“Frank”);
Console.WriteLine(items.IndexOf(john));
控制台。WriteLine(frankInd);
使用LINQ():

int IndexMatched=LbxItemBox.Items.Cast().ToList().FindIndex(x=>x.No==ViewX.No);

您需要告诉它如何比较对象。而且,那不是林克。
List<ViewItem> items = new List<ViewItem>() { new ViewItem(1, "John"), new ViewItem(2, "Jake"), new ViewItem(2, "Frank")};
var john = new ViewItem(1, "John");
var frankInd = items.FindIndex(i => i.Name == "Frank");
Console.WriteLine(items.IndexOf(john));
Console.WriteLine(frankInd);
int IndexMatched = LbxItemBox.Items.Cast<ViewItem>().ToList().FindIndex(x => x.No == ViewX.No);