LINQ 检查可观察集合不包含匹配的对象
本文关键字:包含匹 对象 集合 检查 观察 LINQ | 更新日期: 2023-09-27 18:34:37
试图检查我的 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 有一个与Add(Logged user)
具有相同属性值的 Logging 对象,那么我希望它不添加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:已将我的已记录类更改为以下内容:
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!");
}
}
最好的解决方案是实现 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);
}
}
可比性返回 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
尝试在查询中指定属性以查找匹配项,例如用户名或用户 ID。
public void Add(Logged user)
{
if (!UserList.Any(u => u.Username == user.Username))
{
UserList.Add(user);
}
}
您的对象通过==
运算符通过引用进行比较。这是 c# 中引用类型的常见功能。
可以重写此运算符或重写Equals
方法。
Equals
的新实现不应引发异常。是的 建议任何覆盖Equals
也覆盖的类System.Object.GetHashCode
.还建议除了 实现Equals(object)
,任何类也实现Equals(type)
自己的类型,以增强性能。
此外,还可以为 Logged
类实现IEquatable<T>
。
为避免根据检查 对象的相等性,应重写
Object.Equals
方法 在你的课堂上。这可确保每当类不使用IEquatable.Equals
方法,仍将执行相同的检查。
最后,您可以在方法中比较 2 个实例Where
属性:
if(!UserList.Any(u => u.Login == user.Login))
{
UserList.Add(user);
}