LINQ Check ObservableCollection不包含匹配的Object

Mar*_*all 3 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果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!");
            }
        }
Run Code Online (Sandbox Code Playgroud)

编辑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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该有用吗?然而,当我检查实例并且它们不同时,它仍然说已经存在.

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!");
            }
        }
Run Code Online (Sandbox Code Playgroud)

soy*_*chi 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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑1:

想想您的Logged类.这里的关键是实现实现Equals方法的IEquatable接口.你应该实现明确比较你将应用然后我们在这个类上调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Add方法之后会看起来像:

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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

好的,那我们一定要试试planb.尝试实现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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)