簡體   English   中英

否定`.Where()`LINQ表達式

[英]Negate `.Where()` LINQ Expression

我知道您可以執行以下操作:

enumerable.Where(MethodGroup).DoSomething();

並且這實現了同樣的事情:

enumerable.Where(x => MyMethod(x)).DoSomething();

但是,我希望實現與此相反並選擇方法返回false的項目。 很明顯,第二種情況如何做到這一點:

enumerable.Where(x => !MyMethod(x)).DoSomething();

然而,對於第一個,情況並非如此,因為你無法應用! 運算符到MethodGroup 是否有可能以類似的方式使用MethodGroups實現這種“ .WhereNot ”效果,還是我必須自己滾動(或使用lambdas)?

您可以創建一個輔助方法:

public static Func<T, bool> Not<T>(Func<T, bool> method) 
{
    return x => !method(x);
} 

然后用法將與您想要的非常相似:

someEnumerable.Where(Not(MyMethod)).DoSomething();

您可以使用Except來實現此目的

yourList.Except(yourList.Where(MethodGroup)).DoSomething();

據我所知,沒有內置的方法可以做到這一點,所以要么推出自己的解決方案。 或者只使用我個人認為沒有錯的lambda:

someList.Where(x => !MyMethod(x)).DoSomething();

這也比其他答案更好因為它不會兩次迭代集合。

請注意,只使用lambda使您的代碼比滾動自己的方法或使用某些變通方法更明確。 在這種情況下,對於像這樣簡單的事情,我認為最好堅持使用lambda並且不要在代碼中添加不必要的混淆。

LINQ中提供的方法集沒有直接的方法。 即使你以某種方式實現了這一點,它也不會是一個有效的。

像你想象的那樣,需要像這樣做一個新的

public static IEnumerable<TSource> WhereNot<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    return source.Where(x => !predicate(x));
}

並使用它

var inverseResult = lst.WhereNot(MyMethod);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM