使用LINQ从ObservableCollection源中删除一个元素

6
实际上,它更接近于以下内容的重复: ObservableCollections的RemoveAll方法?

可能重复:
使用LINQ从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); 

@Adam Houldsworth,那是从List<t>中来的,我指定了ObservableCollection Source。 - SupaOden
这与您之前的问题有何不同?http://stackoverflow.com/q/11498056/201088 - Eren Ersönmez
@SupaOden 我注意到了,但我无法撤销关闭投票。如果它被关闭了,请只投票重新开启。抱歉。 - Adam Houldsworth
话虽如此,这更像是 https://dev59.com/H2435IYBdhLWcg3w9FBY 的一个副本。 - Adam Houldsworth
最好的方法是 HomeViewModel.RecentPatients.Where(p => ... ).ToList().All(i => HomeViewModel.RecentPatients.Remove(i)); - G.Dealmeida
2个回答

5

对于重复关闭的混淆,我们深表歉意。这个问题和标记答案将让您拥有从可观察集合中删除扩展方法的支持:

ObservableCollections的RemoveAll?

它不会为from x in y语法提供支持,但它将允许您执行以下操作:

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

然而,通过检查x.PID == p.PID并注意到您的其他问题...如果实际上您想要删除在两个列表中都存在的项目,则这可能不是最佳选项。 Except扩展方法将生成一个可枚举的项目,该项目排除提供作为参数的可枚举项目中的项目,在您的情况下是第二个列表。此方法不会改变现有的可枚举对象,像大多数操作一样,它返回一个新的可枚举对象,因此您需要将其设置为新的ObservableCollection

4
你可以尝试这个。
var toRemove = HomeViewModel.RecentPatients.Where(x=>x.PID == pid).ToList();
foreach (var item in toRemove)
    HomeViewModel.RecentPatients.Remove(item);

2
使用此代码,您应该尝试仅从集合中删除一行。如果超过一个,则会出现以下异常:“Collection was modified; enumeration operation may not execute.” 因此,在第一次执行后中断for each循环或将其复制到新集合中。foreach(var item in toRemove){HomeViewModel.RecentPatients.Remove(item); break;} - Ananda
即使有ToList()在里面? - Jasper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接