问题描述
List<int>l2=newList<int>();boolret2=l2.All(t=>t>10);Console.WriteLine(ret2);这段代码ret2等于true,没道理啊,直观理解应该发牛false啊。
解决方案
解决方案二:
内部代码应该是<br/>bool istrue=true;<br/>foreach(){<br/>if(false){ istrue=false;break;}<br/>}<br/>所以没值时就返回true了
解决方案三:
参考MSDN解释:https://msdn.microsoft.com/en-us/library/bb548541.aspx引用
ReturnValueType:System.Booleantrueifeveryelementofthesourcesequencepassesthetestinthespecifiedpredicate,orifthesequenceisempty;otherwise,false.
解决方案四:
如果源序列中的每一个元素都通过指定的测试或序列是空的,则是真的;否则返回假。//返回结果://trueifeveryelementofthesourcesequencepassesthetestinthespecified//predicate,orifthesequenceisempty;otherwise,false.
解决方案五:
”直观理解“也很符合逻辑啊。除非你没有学过逻辑学。凡是“全部、所有、都.....”都是浮云,这个世界上只有“存在”。要想否定一个说大话的“所有、全部、都......”的说法,你只要举出一个反例即可。逻辑学本来就是这样定义的。如果你认为“直观理解”应该为false,那么说明你想多了,反而没想明白。
解决方案六:
你随便找一本逻辑教材(不一定跟编程有关系),看看全称量词跟存在量词的说明。全称量词跟存在量词是相对的,凡是不能举出一个存在,我们就承认全称量词成立。逻辑不是扯是非,逻辑只是一种语言计算工具。如果有人说“番茄是有毒的”,只要没有第一个人吃番茄,那么这就是成立的。逻辑不是扯是非而只是一种计算工具。所以这个all绝不应该返回false。
解决方案七:
如果你觉得自己经常被自己骗,那么就尽量养成一种好习惯,就是从来不轻易用全称量词。一般来说搞技术的人,不用全称量词。例如他会写varquery1=l2.Any(t=>t>10);varquery2=!I2.Any(t=>t>10);
这里query1与query2正好相互对立。你可以看一些不论是科学家还是政治家的演讲,凡是真正解决问题的人,都会用!Any(...)来说方法论,几乎从来不胡说什么“全部、所有、都....”这类话。喜欢说这些话的人,一种是刚毕业的小孩子,一种是搞销售的,另外一种就是国内的一些“政治经济学”家。