我似乎无法找到一种方法,不会在我的列表中添加相同的对象,我试过。包含但我只是没有让它工作,任何其他解决方法?我相信我必须使用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();
}
答案 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)
if(!kontakte.Any(k => k.Telefonnummer != myKontakt.Telefonnummer
&& k.Name != myKontakt.Name))
kontakte.Add(nyKontakt);
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);
}