确定字符串列表是否在另一个字符串列表中

use*_*050 -8 c# linq

我有两个

List<string>

l1 = {"one", "two","three","four"}
l2 = {"one", "three"}
Run Code Online (Sandbox Code Playgroud)

我想知道l2的所有内容是否都在l1中作为bool?

Ser*_*kiy 10

var allIn = !l2.Except(l1).Any();
Run Code Online (Sandbox Code Playgroud)


jas*_*son 9

用途Enumerable.Except:

var contained = !l2.Except(l1).Any();
Run Code Online (Sandbox Code Playgroud)

请注意,有几个人提出了以下建议:

var contained = l2.All(x => l1.Contains(x));
Run Code Online (Sandbox Code Playgroud)

让我解释为什么这不是最好的解决方案,应该避免.

主要原因是它的速度较慢.因为在每一个项目它的速度较慢l2,但它一个线性扫描通过l1,一遍又一遍的每一个l2.设m长度l1n长度l2.所以这是扫描m项目,完成n时间.因此,总成本是O(m * n).替代方案将使用O(1)分摊查找构建两个哈希表.构建哈希表分别是O(m)O(n).然后,对于每个n项目,检查项目是否在哈希表中.那就是O(n)摊销了.因此,总成本是O(m + n).