搜索自定义类列表的属性
本文关键字:属性 列表 自定义 搜索 | 更新日期: 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
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,则应重载 Equals
并GetHashCode()
。 List.Contains
不起作用的原因是比较了哈希代码下方。 所以你需要重载GetHashCode
并Equals
这样的事情:
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;
}