2012-07-16 58 views
4

其實刪除一個元素,它是一個更接近重複:
RemoveAll for ObservableCollections?使用LINQ to從的ObservableCollection來源

可能重複:
using LINQ to remove objects within a List<T>

這是我使用的代碼,但它不是很有可讀性。我可以使用LINQ來縮短下面的代碼,但仍然具有相同的功能嗎?

int index = 0; 
int pos = 0; 

foreach (var x in HomeViewModel.RecentPatients) 
{ 
    if (x.PID == p.PID) 
     pos = index; 
    else 
     index++; 

} 

HomeViewModel.RecentPatients.RemoveAt(pos); 
+0

@Adam Houldsworth來自列表,我指定了ObservableCollection Source。 – SupaOden 2012-07-16 08:23:31

+0

這與以前的問題有什麼不同? http://stackoverflow.com/q/11498056/201088 – 2012-07-16 08:23:45

+0

@SupaOden我注意到了,但我無法修改密切的投票。只有投票才能重新開放,如果它關閉。道歉。 – 2012-07-16 08:25:14

回答

3

重複封閉混亂的道歉。這個問題和答案明顯會讓你有擴展方法支持從觀察集合刪除:

RemoveAll for ObservableCollections?

它不會放棄對from x in y語法的支持,但它可以讓你做到:

var c = new ObservableCollection<SelectableItem>(); 
c.Remove(x => x.IsSelected); 

但是,通過檢查x.PID == p.PID和關於您的其他問題的說明......如果實際上您想要刪除兩個列表中的項目,則這可能不是最佳選擇。

Except擴展方法將產生一個枚舉項,這些項排除了作爲參數提供的可枚舉項中的項,在您的情況下爲第二個列表。此方法不改變現有的枚舉,就像大多數動作返回一個新的那樣,所以您需要將其設置爲新的ObservableCollection

3

你可以試試這個。

var toRemove = HomeViewModel.RecentPatients.Where(x=>x.PID == pid).ToList(); 
foreach (var item in toRemove) 
    HomeViewModel.RecentPatients.Remove(item); 
+2

的副本使用此代碼,您應該嘗試從集合中只刪除一行。除此之外,我們將得到以下異常:「集合被修改;枚舉操作可能不會執行。」因此,在第一次執行後,爲每個循環打破或複製到一個新的collection.foreach(var item in toRemove) {HomeViewModel.RecentPatients.Remove(item); break;} – Ananda 2014-04-10 10:29:10

+0

即使有ToList()在那裏? – Jasper 2016-06-21 19:46:27