【问题标题】:How to test that all items of list a are in list b如何测试列表a的所有项目都在列表b中
【发布时间】:2019-11-14 19:42:24
【问题描述】:

我有一组搜索词和一个集合。我需要测试该句子是否包含所有搜索词:

var searchTerms = "fox jumped".Split(' ');
var sentence = "the quick brown fox jumped over the lazy dog".Split(' ');
var test = sentence.Contains(searchTerms);

我预计 test 是 True ——但是我得到了一个编译错误: 'string[]' 不包含 'Contains' 的定义,并且最佳扩展方法重载 'System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource)' 有一些无效参数

我应该如何测试该句子是否包含所有搜索词?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您正在尝试检查是否有任何搜索词未出现在句子中:

    if (!searchTerms.Except(sentence, StringComparer.CurrentCultureIgnoreCase).Any())
    

    【讨论】:

    • searchTerms.Any(term => !sentence.Contains(term)) 会执行得更快,还是它们都编译为相同的 IL? (一定要喜欢 IEnumerable)
    • @jbehren:这要慢得多。这是​O(n²),因为它每次都需要遍历另一个列表。
    • 似乎 .Except 遵循相同的行为模式,只是它首先将列表缩小为不同的值(这意味着它比 .Any 方法迭代列表更多):hookedonlinq.com/ExceptOperator.ashx 基本上,创建集合差异似乎将遵循相同的路径。 (我说“似乎”是因为我不知道 LINQ 的内部工作原理)
    • @jbehren:错了。 Except 构建一个 HashSet,因此是 O(n)。
    • 那是有道理的。感谢您抽出宝贵时间:)
    【解决方案2】:

    你可以这样做:

    //test if all of the terms are in the sentence
    searchTerms.All(term => sentence.Contains(term));
    

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 2019-08-25
      • 2019-06-13
      • 2016-04-24
      • 2016-02-13
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多