2012-02-08 20 views
6

Projelerimden birinde, öğenin kimliğe eşit olduğu bir listeden kaldırmaya çalışıyorum. ia yüzden oCiltleme listesinden öğeleri kaldırma

UserList.ToList().RemoveAll(x=>x.id==ID) 

gibi kullanmak Ama bu çalışmayan bir BindingList sahip olduğundan bir liste yöntemini

RemoveAll() 

vardır ve benim liste, şöyle bir BindingList

UserList 

var Daha önce olduğu gibi aynı sayıda öğe. Neden çalışmıyor?

cevap

11

ToList'i çağırarak oluşturduğunuz listenin bir kopyasında çalıştığınız için işe yaramıyor. BindingList removeAll desteklemediği

, o kadar, sadece bir Liste özellik:

var itemToRemove = UserList.Where(x => x.id == ID).ToList(); 
foreach (var item in itemToRemove) 
{ 
    UserList.Remove(item); 
} 

uyarlayarak aksi takdirde biz bir koleksiyon numaralandırma edeceğiz ToList çağırmak gerekiyor.

+0

@rafay üzerinde biz t ihtiyaç aksi takdirde ToList'i arayarak bir istisna oluşturacak şekilde değiştirirken bir koleksiyon numaralandırırız. Bu, Nerede ertelenmiş yürütme nedeniyle. Bir kopya üzerinde çalışırsanız, RemoveAll'ı çağırdığınızda özgün liste (UserList) güncelleştirilmez. –

+0

teşekkürler bunu başardı. –

2

Sen böyle, her türlü nesnenin bir koleksiyon tutmak için kullanılacak niyetinde bir genel sınıf içinde 'removeAll' kullanırsanız bu size

yardımcı olabilecek

UserList = UserList.Where(x => x.id == ID).ToList(); 

deneyebilirsiniz: msdn yorumun

public class SomeClass<T> 

{ 
internal List<T> InternalList; 
public SomeClass() { InternalList = new List<T>(); } 


public void RemoveAll(T theValue) 
{ 
// this will work 
InternalList.RemoveAll(x =< x.Equals(theValue)); 

// the usual form of Lambda Predicate 
//for RemoveAll will not compile 
// error: Cannot apply operator '==' to operands of Type 'T' and 'T' 
// InternalList.RemoveAll(x =&amp;gt; x == theValue); 
} 
} 

: http://msdn.microsoft.com/en-us/library/wdka673a.aspx bu