将代码优化为linq表达式

时间:2017-11-15 12:47:24

标签: c# linq

我有一个可观察的集合,我想从中删除一个元素。我已经尝试过使用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有关,但我不在我的深处。

3 个答案:

答案 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));