[英]Searching the properties of a list of a custom class
我有一个名为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,请在CustomClass中进行如下更改
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 <CustomClass>的.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,则应重载Equals
和GetHashCode()
。 List.Contains
不起作用的原因是在HashCodes下方进行了比较。 因此,您需要重载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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.