2016-07-20 19 views
0

我有一個ReactiveList<Monitor> MonitorsIEnumerable<Monitor> newMonitors。顯示器內部,有定義的唯一SN:如何將IEnumerable合併到ReactiveList中並刪除重複的項目?

public class Monitor 
{ 
    public string SN {get;set;}//unique 
} 

ReactiveList<Monitor> Monitors 
IEnumerable<Monitor> newMonitors 

現在我想合併成newMonitorsMonitors通過SN刪除重複的項目。

我想使用ReactiveList提供的方法而不是一般的LINQ,因爲我想保留在我的綁定中使用的ReactiveList及其DerivedCollection的通知。

我目前的解決辦法是檢查項目已經存在,並逐個添加它,就像

foreach (var m in newMonitors) 
{ 
    if(Monitors.Contains(m))//to override the comparison operators here 
     continue; 
    else 
     Monitors.Add(m); 
} 

我認爲表現將處於低newMonitors的數量可能是數以千計。

任何其他優雅的方式來做到這一點?

回答

0

你可以保持一個HashSet和跟蹤那些在平行增加了按鍵的,只有痛苦會當您添加或刪除需要確保你從兩個集合除

把你的類的成員變量

private readonly HashSet<string> _monitorSet = new HashSet<string>(); 

然後在循環

foreach (var m in newMonitors) 
{ 
    if(_monitorSet.Contains(m.SN)) 
     continue; 
    else 
    { 
     _monitorSet.Add(m.SN); 
     Monitors.Add(m); 
    } 
} 
0

對於代碼段有兩個選擇,我能想到的:

  1. ReactiveList內部使用的ISet(大概`HashSet的爲它的監控名單'在這裏),那麼它會利用散列碼比較O(nlog(n))或附近的插入時間。當然,Monitor需要重寫GetHashCode()和Equals()!你可以用Properties,getter和setter來解決這個問題。

  2. 如果你不能這樣做,那麼O(nn)插入時間是最好的(沒有建立你自己的自定義插入/跟蹤代碼),但只要你的比較代碼很簡單,如果只在SN上進行字符串比較,我不會太在意速度,但請注意下面的內容。

確保在服務表現比較字符串關鍵(及相關的非語言)的情況下,當你不使用默認的==操作符,還有一些主題更快的字符串比較於其他地方SO:P

相關問題