LINQ Check ObservableCollection不包含匹配的Object

时间:2016-02-14 21:10:28

标签: c# linq

尝试检查我的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!");
            }
        }

3 个答案:

答案 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);
}