2011-06-29 14 views
4

ラムダ式を使用して、そのオブジェクト内の値に基づいてリストから特定のオブジェクトを削除しようとしています。ここに私のラムダは、次のとおりです。ここでRemoveAllでリストから項目を削除する

ChartAttributes.ToList().RemoveAll(a => a.AttributeValue.Contains("PILOT")); 

はChartAttributesリストはここでそのAttributeKeyが設定されたチャートの属性があり、上記のリスト

public virtual string AttributeKey { get; set; }  
    public virtual string AttributeValue { get; set; }   
    public virtual int ChartAttributeId { get; set; }   
    public virtual int ChartSpecificationId { get; set; } 

内に含まれるオブジェクトChartAttributeある

IList<IChartAttribute> ChartAttributes 

です「パイロット」へしかし、これは決して削除されません。私は間違って何をしていますか?

おかげ

+0

'ChartAttributes'は何ですか? – Gabe

答えて

10

コードにはIEnumerableがあり、その要素のすべてをリストにコピーして、そのコピーからアイテムを削除しています。ソースIEnumerableは変更されていません。 ToListを呼び出すために必要とせずに、

var list = ChartAttributes.ToList(); 
list.RemoveAll(a => a.AttributeValue.Contains("PILOT")); 
ChartAttributes = list; 

EDIT実際

良い方法:

はこれを試してみてください

ChartAttributes = ChartAttributes.Where(a => !a.AttributeValue.Contains("PILOT")); 
9

.ToList()へのあなたの呼び出しが新しいリストを行い、あなたがそのリストから項目を削除する終わります。

何でもChartAttributesは、その内容には触れていません。

基本的には、このやっている:

var newList = ChartAttributes.ToList(); 
newList.RemoveAll(...); 

をこの時点でnewListの内容を検査した場合、あなたのオブジェクト(複数可)が除去されたことに気づくと思いますが、ChartAttributes、どんなタイプのものまだ、それらのオブジェクトが存在しています。

ChartAttributesから直接オブジェクトを削除する必要がありますが、どのタイプのものなのかわからないので、その方法の例は教えてくれません。

1

あなたがアイテムを削除し、データベースに保存する必要がある場合は、このサンプルコードを試すことができます:

foreach (var x in db.myEntities.Where(a => a.AttributeValue.Contains("PILOT"))) 
    db.myEntities.Remove(x); 
db.SaveChanges(); 

RemoveAllは使用しませんが、内容を保存する別のオプションです。

1

(プロパティのための私のセッターは、内部あったように)私は同様の問題を抱えていたし、代わりにキャストをした:

((List<IChartAttribute>)ChartAttributes).RemoveAll(a => a.AttributeValue.Contains("PILOT")); 
関連する問題