List.Contains对象比较失败

Com*_*ser 5 .net c# class list object

我有一个类"Class1",在.NET 2.0中有一个字符串变量"sText".我创建了该类"lstClass1"的对象列表.它在设置字符串变量后存储该类的许多对象.

完整的代码是:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (!lstClass1.Contains(new Class1("text1")))
            lstClass1.Add(new Class1("text1"));
    }

    public List<Class1> lstClass1 = new List<Class1>();
}

public class Class1
{
    public Class1(string sText)
    {
        this.sText = sText;
    }

    public string sText = "";
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是我只想添加具有唯一文本值的字符串的类对象.例如,如果lstClass1已经有一个字符串变量值为"text1"的对象,那么它不应该允许添加一个也具有"text1"的对象.所以,我写了代码:

if (!lstClass1.Contains(new Class1("text1")))
    lstClass1.Add(new Class1("text1"));
Run Code Online (Sandbox Code Playgroud)

但它总是允许添加文本"text1",即使列表中已存在带有"text1"字符串的对象.我的假设是,在第一个按钮单击事件"button1_Click"时,将添加该对象,因为列表为空但在下一个按钮上单击List.Contains函数将检查列表中是否已存在字符串变量"text1"并且如果找到则不会添加.但它总是允许添加带有文本"text1"的对象,即使它已经存在于列表中.

请注意:我没有采用简单的字符串列表或字符串,因为我想以简单的方式解释列表,类和对象的大问题.

请帮忙.

Paw*_*ger 8

使用Any()方法:

if (!lstClass1.Any(x => x.sText == "text1"))
    lstClass1.Add(new Class1("text1"));
Run Code Online (Sandbox Code Playgroud)

这段代码:

if (!lstClass1.Contains(new Class1("text1")))
    lstClass1.Add(new Class1("text1"));
Run Code Online (Sandbox Code Playgroud)

只有在您提供Equals()GetHashCode()方法以便在Class1此类的两个对象之间进行比较时才能工作.为此,您的类应该实现该IEquatable接口.所以你的Class1看起来像这样:

public class Class1 : IEquatable<Class1>
{
    public Class1(string sText)
    {
        this.sText = sText;
    }

    public string sText = "";

    public bool Equals(Class1 other) 
    {
      if (other == null) 
         return false;

      if (this.sText == other.sText)
         return true;
      else
         return false;
    }

    public override int GetHashCode()
    {
      return this.sText.GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)