我有一个名为CustomClass的自定义类。它包含一个名为“Name”的变量和一个值列表(为了简单起见,我们将它变成一个int - 实际上它是另一个自定义类,但原理应该是相同的。)
所以:
public class CustomClass {
string name;
}
我有List<CustomClass>
。
当我尝试向此List添加一个值时,我想要的逻辑是为了检查它是否包含一个与我想要添加的值同名的CustomClass。
如果是,则执行x,否则执行y。
listOfCustomClass.Contains(customClassToAdd.name)在这种情况下不起作用,我想,但这是我需要的功能。
这里的最佳做法是什么?
答案 0 :(得分:3)
我认为您可以尝试类似var x = MyList.Where(C =&gt; C.Name == InsertedName)并检查结果(未测试)
答案 1 :(得分:1)
你必须创建一个新类,我们称之为CustomList,它继承自IList&lt;&gt;您可以在其中覆盖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);
}
}
答案 2 :(得分:1)
您可以使用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
}
答案 3 :(得分:1)
在我看来,您想要覆盖List&lt; CustomClass&gt;的.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 ...
}
答案 4 :(得分:1)
试试这个:
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;
}
答案 5 :(得分:0)
您可以覆盖CustomClass中的Equals(object o)函数,这样如果两个CustomClasses的名称相同,则认为它们是相同的。然后
listOfCustomClass.Contains(customClassToAdd);
应该有用。
答案 6 :(得分:0)
另一种方法是在CustomClass上重写Equals方法,然后只调用List.Contains()
答案 7 :(得分:0)
如果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;
}