LINQ的All方法有相反的方法吗?

15

我目前正在使用

a_list.All(item => !(item.field_is_true == true))

这个方法很有效,但我想知道是否有一个适当的LINQ方法来执行所有相反的操作。


2
它会被称为None吗? - Jonathan Wood
@JonathanWood LINQ没有None()方法。 - JLRishe
2
我知道,但编写一个空集合很容易。我的意思是,None不是All的相反吗? - Jonathan Wood
是的,如果你真的想要,写None会相当简单,但是!set.Any()可以达到与None相同的效果。 - JLRishe
5个回答

27

All() 用于检查给定的 Predicate 是否对所有项返回 true。在框架开发方面,编写一个单独的方法来检查给定的 Predicate 是否对所有项返回 false 是没有意义的,因为“not”一个 Predicate 很容易。 但是,您可以编写自己的扩展方法:

public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    return !source.Any(predicate);
}

4
你可以使用 Func<T, bool> 替代 Predicate<T> - SWeko

7
All()的确切相反是None,但由于LINQ没有None()方法,因此您可以通过!set.Any()实现相同的结果。
!a_list.Any(item => item.matches == true)

如果a_list中没有任何一个元素的matches值为真,则会产生true

另一个例子:

names.All(item => item.StartsWith("R"))

如果names所有的项都以R开头,则为真(正如您已经知道的那样)。

!names.Any(item => item.StartsWith("R"))

如果`names`中没有任何一个元素以R开头,则为真。
根据您在下面的评论中提到的内容,似乎您只是想以不同的方式实现与当前代码片段相同的结果。这应该会产生与当前代码相同的结果,但谓词中没有感叹号`!`。
!a_list.Any(item => item.matches == true)

这可以进一步简化为:
!a_list.Any(item => item.matches)

我想你的内容也可以简化成这样:

a_list.All(item => !item.matches)

很少有好的理由明确比较布尔值和truefalse

1
假设.matches总是为true,你只需要第二个!而不需要第一个吗? - TankorSmash
1
@TankorSmash 我不确定。你还没有完全解释你想要做什么。我给了你与你的示例完全相反的东西。你具体想确定什么? - JLRishe

2

您写道:

a_list.All(item => !(item.field_is_true == true))

这就像做以下操作:
a_list.All(item => item.flag== false)   // more readable to me...
        //return true if all of the items have a **flase** value on their flag

您也可以使用.any()来实现相同的结果:
!a_list.Any(item => item.flag==true)

关于性能问题: .any().all() - 在使用linq to object时,两者的性能是相同的,更多信息请参见:LINQ: Not Any vs All Don't


1
不要否定All()条件,只需使用相同谓词的Any()并适当处理返回的布尔值。
因此,不要这样做:
bool conditionDoesntExist = a_list.All(item => !(item.field_is_true == true));

你可以拥有

bool conditionDoesExist = a_list.Any(item => item.field_is_true == true)

请注意标记名称的更改。(当然,我忽略了语义问题,例如原始谓词可以写成item => item.field_is_true == false或者简单地写成item => !item.field_is_true)。
如果您想保持标记名称不变,则仍需使用Any()但否定它:
bool conditionDoesntExist = !a_list.Any(item => item.field_is_true == true);

1
使用 linq to object 时不应该有性能差异。请参见链接 - yoav barnea

0

全部

a_list.All(item => item.condition)

一些

a_list.Any(item => item.condition)

并非全部

!a_list.All(item => item.condition)

或者:

a_list.Any(item => !(item.condition))

!a_list.Any(item => item.condition)

或者

a_list.All(item => !(item.condition))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接