我有一个可观察的集合,我想从中删除一个元素。我已经尝试过使用linq .Where语法,但我对演员工作感到困惑。
public class Atc
{
public string Code { get; set; }
public string Description { get; set; }
public string ParentDescriptions { get; set; }
}
我定义了可观察到的药物集合,
public ObservableCollection<Atc> MedicinesObservableCollection
我有一个方法来过滤掉有效的集合中的项目:
private void RemoveMedicineListItem(string code)
{
var filteredCollection = new ObservableCollection<Atc>();
foreach (var item in MedicinesObservableCollection)
{
if (item.Code != code)
{
filteredCollection.Add(item);
}
}
MedicinesObservableCollection = filteredCollection;
}
我试过了:
(ObservableCollection<Atc>)MedicinesObservableCollection.Where(x => x.Code != code);
但这会获得运行时异常 System.InvalidCastException:'无法将'WhereEnumerableIterator1 [Atc]'类型的对象强制转换为'System.Collections.ObjectModel.ObservableCollection1 [Atc]'。'
我知道这与linq enumerables有关,但我不在我的深处。
答案 0 :(得分:4)
您无法强制转换 WhereIterator<Atc>
(您的Where
- 子句实际返回的实例)的实例到ObservableCollection<Atc>)
。返回的实例只实现IEnumerable<Atc>
,这是你可以迭代它。但是,它并没有将任何任何与任何列表共同,或者特别是与 observable 一样。
但是,您可以根据返回的值创建一个新的
var result = new ObservableCollection(MedicinesObservableCollection.Where(x => x.Code != code));
答案 1 :(得分:3)
所有答案都是正确的,但在使用ObservableCollection
时,最好对同一个对象执行删除操作,而不是创建新列表。
MedicinesObservableCollection.Remove(MedicinesObservableCollection.FirstOrDefault(x => x.Code == code));
这是因为重新创建集合可能会强制重新呈现列表中的所有项目,这样只会从同一个集合中删除一个项目。
答案 2 :(得分:1)
Linq没有返回与输入相同类型的集合。见this。因此,您ObservableCollection<Atc>
的广告投放失败了,因为它是IEnumerable
的内部实施,而不是ObservableCollection
。
解决方案就是创建一个新的ObservableCollection:
var items = new ObservableCollection<Atc>(MedicinesObservableCollection.Where(x => x.Code != code));