C# 无法识别列表对象

C# 无法识别列表对象,c#,list,C#,List,我的对象类型有问题。我得到的东西是凯戈里。当列表包含它时,不能添加对象,但是下面的代码会添加它,第二次我发送相同的对象时,它不会添加。所以我认为这是关于铸造,但即使我铸造它的工作,正如我之前所描述的。我可以用for循环来解决它,但我想知道为什么这不起作用 private List<Category> choosenCategoriesList = new List<Category>(); //categoriesList to be used in categoriza

我的对象类型有问题。我得到的东西是凯戈里。当列表包含它时,不能添加对象,但是下面的代码会添加它,第二次我发送相同的对象时,它不会添加。所以我认为这是关于铸造,但即使我铸造它的工作,正如我之前所描述的。我可以用for循环来解决它,但我想知道为什么这不起作用

private List<Category> choosenCategoriesList = new List<Category>(); //categoriesList to be used in categorization stage
private List<Category> categoriesList = new List<Category>();

Category categ = categoriesList.Find(x => x.name == cdm_comboBox.SelectedItem.ToString());
if (!choosenCategoriesList.Contains(((Category)categ)))
{
      choosenCategoriesList.Add(categ);
      categorizationFinished = false;
}

这可能是因为您将类别中的项目作为所选项目。第二次可能是项不存在,因此其为空且未添加到列表中以使用列表。包含您需要实现IEquatable接口并重写类的Equals函数

public class Category: IEquatable<Category>
{

   string name;
   int id;

public override bool Equals(object obj)
    {
        if (obj == null) return false;
        Category objAsCategory = obj as Category;
        if (objAsCategory == null) return false;
        else return Equals(objAsCategory);
    }

public bool Equals(Category other)
    {
        if (other == null) return false;
        return (this.id.Equals(other.id));
    }
}
这会告诉您的对象,当根据您的描述调用Equals时,是什么使其成为重复的对象,而不需要是对象的精确引用

另一个选项是use List..Existsx=>x.name==name;这与查找相同,但将返回布尔值,而不是查找到的对象


有关这方面的更多信息,请参见此处:

但在开始时有这些项目。例如,环境类别在ChooseSCategoriesList中,我在即时窗口中比较对象,即使它们相同,也返回false。即使我投了它,结果也是错误的。你在类别上声明了相等比较方法了吗?i、 它是可比的吗?不,我现在检查一下。我认为ContainesCategoryCateg是为MeContaines做的。Containes需要知道如何比较两个项目,以便确定它们是等效的。如果您没有指定任何内容,那么它将使用此处所述的默认比较方法,并且当前必须确定这些项不相同。该函数包含调用对象的相等函数。通过实现IEquatable接口,您可以决定是什么使一个对象等于另一个对象。如果不需要,则需要为equal精确复制对象的同一引用以返回true。是的,因此需要传入一个比较器,该比较器检查等价性,而不是匹配引用