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!");
            }
        }

LINQ 检查可观察集合不包含匹配的对象

最好的解决方案是实现 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);
}
相关文章: