2017-11-15 5 views
0

私は観測可能なコレクションを持っています。要素を削除したいです。私はlinq。どこの構文を使用しようとしましたが、私はキャスティングに固執しています。linq式にコードを最適化

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の列挙型と関係がありますが、私は自分の深みから外れています。

+0

コンストラクタを使用します。['ObservableCollection (IEnumerable )'](https://msdn.microsoft.com/en-us/library/cc679169(v=vs.110).aspx) – Sinatr

答えて

3

すべての答えは正しいですが、むしろ、新しいリストを作成する同じオブジェクトの削除を行う方が良いでしょうObservableCollectionを使用した場合。

MedicinesObservableCollection.Remove(MedicinesObservableCollection.FirstOrDefault(x => x.Code == code)); 

コレクションを再作成すると、再レンダリングし、この方法は一つだけのアイテムが同じコレクションから削除されますように、リスト内のすべてのアイテムを強制する可能性があるためです。

4

あなたはcan't ObservableCollection<Atc>)に(実際に戻ります-clauseいるあなたWhere)をWhereIterator<Atc>のインスタンスをキャスト。返されるインスタンスはIEnumerable<Atc>しか実装されていませんが、これはを反復することができますです。しかし、何かと共通していないか、特にの観測可能なと一致していません。

var result = new ObservableCollection(MedicinesObservableCollection.Where(x => x.Code != code)); 
1

LINQのは、入力と同じ型のコレクションを返しません:

は、しかし、あなたは 返された値に基づいて新しいものを作成することができます。 thisを参照してください。だから ObservableCollection<Atc>へのキャストは IEnumerableの内部実装の一部であり、 ObservableCollectionではなく失敗します。

ソリューションは、単に新しいObservableCollectionを作成することです:

var items = new ObservableCollection<Atc>(MedicinesObservableCollection.Where(x => x.Code != code));