空のシーケンスに対するLinqのEnumerable.Allは一律Trueを返す

シーケンスのすべての要素が条件を満たしている場合にTrueなので、てっきり空のシーケンスは1件も条件を満たすものが無いので一律Falseを返すものと思いきや、Trueを返してきました。

Anyの方はFalseを返します。

とても違和感があったのですが、.NET Framework のソースを見て、なるほどと思いました。

  • Allは、シーケンスの中で、条件に一致しないものがあったらFalse
  • Anyは、シーケンスの中で、条件に一致するものがあったらTrue

といったような実装になっているため、空の場合に返すものが異なっていました。(確かにこう実装するかなと…)

下記が .Net Framework 4.5でのソースになります。(.NET Framework Libraries からダウンロードできます)

とりあえず、「Allは条件に一致しない要素があったらFalse、それ以外はTrue」と覚えておこうと思いました。