2016-02-14 100 views
2

試圖檢查我的ObservableCollection沒有匹配我想要添加的對象。LINQ Check 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)話,我希望它不添加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!"); 
      } 
     } 
+2

你的問題到底是什麼? –

回答

4

最好的解決方案是實現IEquatable爲@瓦迪姆 - 馬丁諾夫說。

另一個快,但沒有這麼幹淨的解決方案是通過明確比較值來搜索:

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接口誰實施等於方法。你應該實施明確比較你將申請然後我們呼籲等於在這個類。

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:

好吧,那麼我們必須嘗試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); 
    } 
} 

IComparable returns 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 
+0

如何實現** IEquatable **?查看編輯 –

+1

@ martyn-ball我更新了我的答案。 – soydachi

+0

這就是我所期望的,但是我已經完成了這個工作,但仍然得到'已經存在'的MessageBox顯示:SI已經嘗試添加一個MessageBox來在IF語句上方顯示'user'屬性,並且值IS不同......:S –

1

默認情況下,您的對象通過參考==運算符進行比較。這是c#中引用類型的常見特徵。

您可以override此操作員或覆蓋Equals方法。

Equals的新實現不應該拋出異常。它是 建議任何覆蓋Equals的類也覆蓋 System.Object.GetHashCode。還建議除 執行Equals(object)之外,任何類別還執行Equals(type)爲 自己的類型,以提升性能。

此外,您可以implementIEquatable<T>爲您的Logged類。

爲了避免這取決於你檢查對象的 平等的方式不同的結果,你應該重寫你們班Object.Equals方法 。這確保了每當一個班級不使用 ,IEquatable.Equals方法時,仍將執行相同的檢查。

最後可以在裏面Where方法比較兩個實例的某些屬性:

if(!UserList.Any(u => u.Login == user.Login)) 
{ 
    UserList.Add(user); 
} 
+0

你不能***只重寫'Equals'方法。您還必須始終重寫'GetHashCode'。 – Enigmativity

+0

是的,這就是爲什麼我添加一個鏈接到教程,這有助於以正確的方式做到這一點,先生。減去。 –

+0

你的回答應該包含它所需要的所有信息,鏈接只應該在那裏以支持你的問題中的內容。不鼓勵外部鏈接回答。 – Enigmativity

2

嘗試在查詢中指定的屬性來查找匹配,恩。用戶名或用戶名。

+0

查看編輯代碼,當試圖添加具有不同值的Logged實例時,我得到'Already exists!'。 –

+0

查看更新的答案。 –