2010-07-24 30 views
10

,如果我有LINQ從對象數組中刪除項,其中屬性等於值

IEnumberable<Car> list 

,我想基於汽車的屬性,從這個列表中刪除的項

我想是這樣的:

list.RemoveWhere(r=>r.Year > 2000) 

做這樣的事情存在嗎?

我這樣做一遍又一遍,所以我想避免每次複製列表中只刪除一個項目

+0

它是一個'清單'或只是一個IEnumerable的''? – 2010-07-24 14:26:42

回答

13

IEnumberable是一成不變的,但你可以以這樣的事:

list = list.Where(r=>r.Year<=2000) 

或寫一個擴展方法:

public static IEnumerable<T> RemoveWhere<T>(this IEnumerable<T> query, Predicate<T> predicate) 
{ 
    return query.Where(e => !predicate(e)); 
} 
+0

看到更新的問題 – leora 2010-07-24 14:22:35

+0

@ooo IEnumerable的是不變的,所以你不能簡單的添加或刪除的項目,這是不可能的。當然你可以使用一個List,但是不可能說這是否會更快。如果你反覆這樣做,請記住延遲執行。 – sloth 2010-07-24 14:32:47

4

如果您正在使用IEnumerable<T>工作,怎麼樣在哪裏?

list = list.Where(car => car.Year <= 2000); 

如果您正在使用ICollection<T>工作,你不只是得到一個過濾的結果,但真的打算操縱源集合,你可以創建自己定製的擴展集:

public static class CollectionExtensions { 
    public static ICollection<T> RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate) { 
     List<T> toRemove = collection.Where(item => predicate(item)).ToList(); 
     toRemove.ForEach(item => collection.Remove(item)); 
     return collection; 
    } 
    } 
+0

看到更新的問題 – leora 2010-07-24 14:22:56

+0

看到我更新的答案;-) – 2010-07-24 14:34:24

6

非常遲到了,但對於任何一個會遇到這個問題,這裏是一個清晰的解決方案:

MyList.RemoveAll(p => p.MyProperty == MyValue); 
相關問題