在C#中,如果我有一个类型为bool的列表。最快的方法是确定列表是否包含true值?我不需要知道有多少个或者true值在哪里。我只需要知道是否存在一个true值。我将搜索许多非常大的列表。
只需使用bool trueInList = list.Contains(true);
。这将循环遍历列表,直到存在true
为止。
为什么需要在如此简单的用例中使用更快的东西?
使用list.Contains(true)或list.Any(true)。对于普通的列表,两者的复杂度都是O(n)。由于Any()是一个扩展方法,需要调用委托,所以Contains()可能会稍微快一些。但为了确保,我建议使用大型集合测试这两个方法。
Any
重载需要一个委托。你说list.Any(true)
,但是true
不是一个委托,所以无法编译通过。如果你想使用LINQ(出于某种疯狂的原因),它的方法也叫做Contains
。要调用LINQ的Contains
,可以使用list.AsEnumerable().Contains(true)
(其中AsEnumerable
确保List<>
本身的实例方法不适用),或者使用list.Contains<bool>(true)
(其中泛型参数的存在排除了List<>
的非泛型实例方法)。但正如lazyberezovsky在其他地方所说:如果你有List<>
,为什么要使用LINQ呢? - Jeppe Stig Nielsenlist.Any(b => b);
试试这个:
var result = myBoolList.Any(i => i==true);
==true
,为什么现在要添加它呢? - Silvermind.Any(x => x==WANTED)
,它被称为.Contains(WANTED)
。(这假设编译时重载的==
具有与___virtual___ object.Equals(object)
方法相同的行为,但在这种情况下是成立的。) - Jeppe Stig NielsenAny(...)
。list.Any(c => c == true);
list.Any(c => c);
if(list.BinarySearch(true) > 0){...}
List<bool>
来说可能有些奇怪),仍然不能说使用 >0
是正确的。应该是 >=0
才行。因为列表可能非常短,只有 true
条目,那么 BinarySearch
可能会返回 0
,表示:在索引 0
处找到了匹配项,所以 list[0]
匹配。 - Jeppe Stig Nielsenint falseCount; int trueCount;
。trueCount > 0
假设您需要该列表,请使用List.Contains
,因为它直接搜索底层数组。true
来比较每个元素。您甚至可以展开循环或进行不安全的代码技巧。bool val = false;
Foreach(bool val in listofvalue)
{
val |= val;
}
if(val)
print "List contain true value"
else
print "List contain false value"
|=
而不是 =||
。但是 @treze 是正确的,没有必要将它们全部 OR 在一起。 - Jeppe Stig Nielsen