搜索自定义类列表的属性

本文关键字:属性 列表 自定义 搜索 | 更新日期: 2023-09-27 18:34:24

我有一个名为CustomClass的自定义类。它包含一个名为"Name"的变量和值列表(为了简单起见,让我们将其设为一个int - 实际上它是另一个自定义类,但原理应该是相同的)。

所以:

public class CustomClass {
   string name;

} 

我有一个List<CustomClass>.

当我尝试向此列表添加值时,我想要的逻辑是让此列表检查它是否包含与我要添加的值同名的 CustomClass。

如果是,则执行 x,否则执行 y。

listOfCustomClass.Contains(customClassToAdd.name)在这种情况下不起作用,我假设,但这是我需要的功能。

这里的最佳实践是什么?

搜索自定义类列表的属性

我认为您可以尝试类似var x = MyList.Where(C => C.Name == InsertedName)并检查结果(未测试)

您必须创建一个新类,我们称之为 CustomList,它继承自 IList<>您可以在其中重写 add 方法,执行检查,然后将其添加到基库中。 像这样:

public class CustomList<T> : IList<T> where T : CustomClass
{
    private List<T> innerlist;
    public void Add(T item)
    {
        if(innerlist.Any(a => a.Name == item.Name)))
            innerlist.Add(item);
    }
}
您可以使用

linq 执行此操作,如下所示,但您必须公开名称字段。

        List<CustomClass> list = new List<CustomClass>();
        CustomClass toCheck = new CustomClass();
        if (list.Any(p => p.name.Equals(toCheck)))
        {
            //do x here
        }
        else
        {
            //do y here
        }

但是,如果您不想使用 linq,请在自定义类中进行一些更改,如下所示

public class CustomClass
{
    string name;
    List<int> intLost = new List<int>();
    public override bool Equals(object obj)
    {
        return this.Equals(obj as CustomClass);
    }
    public override int GetHashCode()
    {
        return 0;
    }
    public bool Equals(CustomClass cc)
    {
        if (cc == null) return false;
        return this.name.Equals(cc.name);
    }
}

然后你可以这样做。

        List<CustomClass> list = new List<CustomClass>();
        CustomClass toCheck = new CustomClass();
        if (list.Contains(toCheck))
        {
            //do x here
        }
        else
        {
            //do y here
        }

在我看来,您想覆盖 .List的 Add() 行为。 虽然您可以使用扩展方法,但我认为更好的解决方案是发明一个以某种方式扩展 List 的类。 如果您需要对添加操作进行这种级别的控制,我建议您在您的集合类中实现 IList......

    public class CustomClassList : IList<CustomClass>
    {
        public void Add (CustomClass item)
        {
            if(this.Select(t => t.Name).Contains(item.Name))
                // Do whatever here...
            else
                // Do whatever else here...
        }
        // ... other IList implementations here ...
    }

试试这个:

IList<CustomClass> list = new List<CustomClass>();
CustomClass customClass = new CustomClass();
customClass.name = "Lucas";
if((list.Tolist().Find(x => x.name == customClass.name)) == null)
{
    list.Add(customClass);
}
else
{
    //do y;
}

您可以覆盖 CustomClass 中的 Equals(object o) 函数,以便两个 CustomClass 在名称相同时被视为相等。然后

listOfCustomClass.Contains(customClassToAdd);

应该工作。

另一种方法是重写 CustomClass 上的 Equals 方法,然后调用 List.Contains()

如果

name 属性唯一标识 CustomClass,则应重载 EqualsGetHashCode()List.Contains不起作用的原因是比较了哈希代码下方。 所以你需要重载GetHashCodeEquals这样的事情:

public override int GetHashCode()
{
    return this.name.GetHashCode();
}
public override bool Equals(object obj)
{
    var other = obj as CustomClass;
    if (other != null)
    {
        if (other.Name == this.Name)
        {
             return true;
        }
    }
    return false;
}