我有两个
List<string>
l1 = {"one", "two","three","four"}
l2 = {"one", "three"}
我想知道所有 l2 是否都在 l1 作为布尔值?
var allIn = !l2.Except(l1).Any();
var contained = !l2.Except(l1).Any();
请注意,有几个人提出了以下建议:
var contained = l2.All(x => l1.Contains(x));
让我解释一下为什么这不是最好的解决方案,应该避免。
主要原因是因为它比较慢。它比较慢,因为对于 中的每个项目l2
,它都会对 中的每个项目进行一次又一次的线性扫描。设为 的长度,为的长度。所以这是对项目的扫描,完成时间。因此,总成本为。另一种方法是使用分摊查找构建两个哈希表。分别构建哈希表。然后,对于每个项目,检查该项目是否在哈希表中。也就是摊销。因此,总成本为。l1
l2
m
l1
n
l2
m
n
O(m * n)
O(1)
O(m)
O(n)
n
O(n)
O(m + n)
干得好
bool b = l2.All( s => l1.Contains(s));