【问题标题】:Determine if list of strings is in another list of strings [closed]确定字符串列表是否在另一个字符串列表中[关闭]
【发布时间】:2013-07-31 20:31:52
【问题描述】:

我有两个

List<string>

l1 = {"one", "two","three","four"}
l2 = {"one", "three"}

我想知道是否所有 l2 都在 l1 中作为布尔值?

【问题讨论】:

  • 大量重复
  • ... 这不是问题。这是一个请求。到目前为止,您尝试过什么?
  • C# Is String in Array的可能重复
  • @jason 这是一个问得很糟糕的问题,表明没有努力寻找解决方案,并且可能是重复的。但你是对的,它是关于主题的。

标签: c# linq


【解决方案1】:
var allIn = !l2.Except(l1).Any();

【讨论】:

    【解决方案2】:

    使用Enumerable.Except:

    var contained = !l2.Except(l1).Any();
    

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

    var contained = l2.All(x => l1.Contains(x));
    

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

    主要原因是速度较慢。它比较慢,因为对于l2 中的每个项目,它都会对l1 进行线性 扫描,一遍又一遍地对l2 中的每个 项目进行扫描。设ml1 的长度,nl2 的长度。这是对m 项目的扫描,完成n 次。因此,总成本为O(m * n)。另一种方法是使用O(1) 摊销查找构建两个哈希表。构建哈希表分别是O(m)O(n)。然后,对于每个n 项目,检查该项目是否在哈希表中。那是O(n),摊销。因此,总成本为O(m + n)

    【讨论】:

      【解决方案3】:

      给你

       bool b = l2.All( s => l1.Contains(s));
      

      【讨论】:

      • 这将比替代方案慢。也就是说,它就像O(m * n) 之类的东西,而不是O(m + n)(这里mn 是列表的长度)。
      • @Jason:也许这是真的。为什么不解释为什么它更慢?那会很有启发性。
      • @stakx:见我的answer,我在回复中进行了编辑。
      猜你喜欢
      • 2018-06-06
      • 2021-10-26
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多