不要将重复的对象添加到List中

时间:2015-01-29 14:16:28

标签: c#

我似乎无法找到一种方法,不会在我的列表中添加相同的对象,我试过。包含但我只是没有让它工作,任何其他解决方法?我相信我必须使用if语句,并在else中创建对象,但我如何在if语句中做?

public Form1()
    {
        InitializeComponent();
    }
    private const string filnamn = "kontakter.bin";
    Kontakter kontakt;
    private List<Kontakter> kontakter;


    private void buttonLagra_Click(object sender, EventArgs e)
    {
            Kontakter nyKontakt = new Kontakter();
            {
                nyKontakt.Telefonnr = textBoxTelefonnr.Text;
                nyKontakt.Namn = textBoxNamn.Text;
            }

            kontakter.Add(nyKontakt);
            listBox1.DataSource = null;
            listBox1.DataSource = kontakter;
            BinaryFormatter bf = new BinaryFormatter();
            FileStream fs = new FileStream(filnamn, FileMode.OpenOrCreate, FileAccess.Write);
            bf.Serialize(fs, kontakter);
            fs.Close();
        }

6 个答案:

答案 0 :(得分:5)

List.Contains(o)检查对象o引用是否在列表中。事实并非如此,正如您o = new {...}所做的那样。

您想要检查列表中是否存在包含相同属性的对象:

if (!kontakter.Any(k => k.Telefonnr == textBoxTelefonnr.Text
                     && k.Namn == textBoxNamn.Text))
{
    kontakter.Add(new {...});
}

您也可以让Kontakter实施IEquatable<Kontakter>.Contains()确实按照您的预期执行。有关实施,请参阅.Contains on a list of custom class objects

答案 1 :(得分:0)

List.Contains不起作用,因为你需要在类定义中实现equals方法。 最后,试试List<Kontakter> distinct = kontakter.Distinct().ToList(); 一定要包括System.Linq!

答案 2 :(得分:0)

在您的情况下,您必须覆盖Kontakter上的Equals定义,然后定义相等对象的逻辑。在不重写.NET的情况下,比较始终不同的对象类型,因为我们在MSDN https://msdn.microsoft.com/en-us/library/bsc2ak47%28v=vs.110%29.aspx上执行新的关键字。示例代码

            public class Kontakter {
             public bool override Equals(Object obj) {    
                       var castedObj  = (Kontakter)obj;
                       return castedObj.PropertyOne == this.ProperyOne &&  castedObj.Property2 == this.Property2
                   }
             }

答案 3 :(得分:0)

解决方案1与Linq的Any:

if(!kontakte.Any(k => k.Telefonnummer != myKontakt.Telefonnummer 
                    && k.Name != myKontakt.Name))
    kontakte.Add(nyKontakt);

解决方案2在Kontakt类上实现Equals:

public class Kontakt
{  
   public override bool Equals(Object obj) 
   {
      Kontakt other = obj as Kontakt;

      if (other == null) 
         return false;    

      return other.Telefonnummer == this.Telefonnummer 
            && other.Name == this.Name;
   }
}

然后你可以使用

if(!kontakte.Contains(myKontakt))
    kontakte.Add(myKontakt);

答案 4 :(得分:0)

您需要检查是否存在密钥,例如名称:

    private void buttonLagra_Click(object sender, EventArgs e)
    {
        Kontakter nyKontakt = new Kontakter();
        {
            nyKontakt.Telefonnr = textBoxTelefonnr.Text;
            nyKontakt.Namn = textBoxNamn.Text;
        }

        bool exists = false;
        foreach (var item in kontackter)
        {
            if (item.Namn == nyKontakt.Namn)
            {
                exists = true;
                break;
            }
        }

        if (!exists)
        {
            kontakter.Add(nyKontakt);
            listBox1.DataSource = null;
            listBox1.DataSource = kontakter;
            BinaryFormatter bf = new BinaryFormatter();
            FileStream fs = new FileStream(filnamn, FileMode.OpenOrCreate, FileAccess.Write);
            bf.Serialize(fs, kontakter);
            fs.Close();
        }
    }

答案 5 :(得分:0)

使用foreach并在向列表中添加新项目之前检查当前文本框条目不是您的列表..

 bool found = false;

 foreach(Kontakter thisKontakt in kontakter)
 {
     if ((thisKontakt.Telefonnr == textBoxTelefonnr.Text) && (thisKontakt.Namn == textBoxNamn.Text))
     {
         found = true;
         break;
     }
 }

 if(!found)
 {
     kontakter.Add(thisKontakt);
 }