尝试检查我的ObservableCollection是否有一个与我试图添加的对象匹配的对象。
例如:
public class LoggedUsers : NotifyUIBase
{
public ObservableCollection<Logged> UserList { get; private set; }
public LoggedUsers()
{
UserList = new ObservableCollection<Logged>();
}
public void Add(Logged user)
{
if (UserList.Where(x => x == user))
{
UserList.Add(user);
}
}
}
因此,如果ObservableCollection的Logged对象具有与Add(Logged user)
相同的属性值,那么我希望它不添加user
。
修改1:
public class LoggedUsers : NotifyUIBase
{
public ObservableCollection<Logged> UserList { get; private set; }
public LoggedUsers()
{
UserList = new ObservableCollection<Logged>();
}
public void Add(Logged user)
{
if (!UserList.Any(x => x == user))
{
UserList.Add(user);
////Check the List for users
UpdateView();
}
else
{
MessageBox.Show("Already exists!");
}
}
编辑2: 将我的Logged类更改为以下内容:
namespace PhotoManagement
{
public class Logged : Common.NotifyUIBase
{
public string ClearPassword { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public long UID { get; set; }
public string Email { get; set; }
//Display basic statistics
public int ThisDayImageCount { get; set; }
public int ThisDaySaleCount { get; set; }
public Logged()
{
//Update the stats when instigated
UpdateStats();
}
//Update the stats
public void UpdateStats()
{
}
public bool Equals(Logged other)
{
if (other == null) return false;
return (this.UID.Equals(other.UID));
}
}
}
这应该有用吗?然而,当我检查实例并且它们不同时,它仍然表示已经存在。
public class LoggedUsers : NotifyUIBase
{
public ObservableCollection<Logged> UserList { get; private set; }
public LoggedUsers()
{
UserList = new ObservableCollection<Logged>();
}
public void Add(Logged user)
{
if (!UserList.Any(x => x.Equals(user)))
{
UserList.Add(user);
UpdateView();
}
else
{
MessageBox.Show("Already exists!");
}
}
答案 0 :(得分:5)
最佳解决方案是实施 IEquatable ,如@ vadim-martynov所述。
另一个快速但不那么干净的解决方案是通过明确比较值进行搜索:
public void Add(Logged user)
{
if (!UserList.Any(x => x.Id == user.Id && x.UserName == user.UserName))
{
UserList.Add(user);
////Check the List for users
UpdateView();
}
else
{
MessageBox.Show("Already exists!");
}
}
修改1:
考虑一下已记录的类。这里的关键是实现 IEquatable 接口,实现 Equals 方法。你应该实施明确比较,然后我们在这个类上调用 Equals 。
public class Logged: IEquatable<Logged>
{
public int Id { get; set; }
public string UserName { get; set; }
public string OtherProperty { get; set; }
public bool Equals(Logged other)
{
return this.Id == other.Id && this.UserName == other.UserName;
}
}
添加方法后,将显示如下:
public void Add(Logged user)
{
if (!UserList.Any(x => x.Equals(user)))
{
UserList.Add(user);
////Check the List for users
UpdateView();
}
else
{
MessageBox.Show("Already exists!");
}
}
编辑2:
好的,那我们必须尝试一个计划。尝试实施 IComparable 并尝试使用此功能。 IEquatable 应该可以工作,但如果没有,这也可以工作。
public class Logged: IEquatable<Logged>, IComparable<Logged>
{
public int Id { get; set; }
public string UserName { get; set; }
public string OtherProperty { get; set; }
public bool Equals(Logged other)
{
return this.Id == other.Id && this.UserName == other.UserName;
}
public int CompareTo(Logged other)
{
return this.Id.CompareTo(other.Id);
}
}
IComparable返回int。因此用法和整数结果为:
var result = x.CompareTo(user)
// Comparing 'some text' with '123': 1
// Comparing 'some text' with 'some text': 0
// Comparing 'some text' with 'Some Text': -1
答案 1 :(得分:2)
尝试在查询中指定属性以查找匹配项,例如。用户名或用户ID。
classBlock
答案 2 :(得分:1)
默认情况下,您的对象通过==
运算符进行比较。它是c#中引用类型的共同特征。
您可以override此操作符或覆盖Equals
方法。
Equals
的新实现不应抛出异常。它是 建议任何覆盖Equals
的类也会覆盖System.Object.GetHashCode
。还建议除此之外 实施Equals(object)
,任何类都实现Equals(type)
他们自己的类型,以提高性能。
此外,您Logged
课程可以implement IEquatable<T>
。
根据您检查的方式,避免出现不同的结果 对象相等,您应该覆盖
Object.Equals
方法 在你的班上这确保了每当一个类不使用时IEquatable.Equals
方法,仍然会执行相同的检查。
最后,您可以比较Where
方法中的2个实例的一些属性:
if(!UserList.Any(u => u.Login == user.Login))
{
UserList.Add(user);
}