【问题标题】:How to use Linq to check if a list of strings contains any string in a list如何使用 Linq 检查字符串列表是否包含列表中的任何字符串
【发布时间】:2014-07-08 23:33:45
【问题描述】:

我正在构建一个 linq 查询,它将检查数据库中的字符串是否包含字符串列表中的任何字符串。

类似的东西。

query = query.Where(x => x.tags
                   .Contains(--any of the items in my list of strings--));

我还想知道列表中有多少项匹配。

任何帮助将不胜感激。

更新:我应该提到标签是一个字符串而不是一个列表。在查询实际运行之前,我将添加更多与标签无关的 where。这是针对实体框架运行的。

【问题讨论】:

  • x.tags 也是一个列表吗?
  • 您能提供一些示例输入和输出吗?您可能会想要使用 PredicateBuilder,但“知道匹配了多少项”可能会使事情变得更加复杂。

标签: c# linq list contains


【解决方案1】:

我最近遇到了类似的问题,这是我设法解决的方法:

var list = [list of strings];
if (list != null && list.Any())
{
    queryable = queryable.Where(x => x.tags != null);
    var tagQueries = new List<IQueryable<WhateverTheDbModelIs>>();
    foreach (var element in list)
    {
        tagQueries.Add(queryable.Where(x => x.tags.Contains(element)));
    }
    IQueryable<WhateverTheDbModelIs> query = tagQueries.FirstOrDefault();
    foreach (var tagQuery in tagQueries)
    {
        query = query.Union(tagQuery);
    }
    queryable = queryable.Intersect(query);
}

可能不是最好的选择,但经验不足的开发人员可以理解和使用

【讨论】:

    【解决方案2】:

    我以前做过这样的事情:

    var myList = new List<string>();
    myList.Add("One");
    myList.Add("Two");
    
    var matches = query.Where(x => myList.Any(y => x.tags.Contains(y)));
    

    【讨论】:

    • y 是什么?你在哪里定义的? X 不是您要查找的搜索词吗?
    【解决方案3】:

    我不太确定 x.tags 是字符串还是列表,如果它是列表 Jon Skeet 的答案是否正确。如果我理解正确,虽然 x.tags 是一串字符串。如果是这样,那么解决方案是:

    list.Any(x => x.tags.IndexOf(x) > -1)
    

    数一数

    list.Count(x => x.tags.IndexOf(x) > -1)
    

    【讨论】:

      【解决方案4】:

      编辑:这个答案假定tags 是字符串的集合...

      听起来你可能想要:

      var list = new List<string> { ... };
      var query = query.Where(x => x.tags.Any(tag => list.Contains(tag));
      

      或者:

      var list = new List<string> { ... };
      var query = query.Where(x => x.tags.Intersect(list).Any());
      

      (如果这是使用 LINQ to SQL 或 EF,您可能会发现其中一个有效,而另一个无效。仅在 LINQ to Objects 中,两者都应该有效。)

      要获得计数,您需要以下内容:

      var result = query.Select(x => new { x, count = x.tags.Count(tag => list.Contains(tag)) })
                        .Where(pair => pair.count != 0);
      

      那么result的每个元素是一对x(项目)和count(匹配标签的数量)。

      【讨论】:

      • 如果标签是字符串,这仍然适用吗?
      • 不,您需要更改它——我假设tags 是复数,它是标签的集合。如果它是单个值,为什么称为“标签”?或者它是一个逗号分隔的值?这会让事情变得更复杂。
      • 它是一个逗号分隔值的字符串。希望能够检查列表中的任何字符串是否位于分隔值字符串中的任何位置。
      • @Lrayh:你怎么希望我们猜到这就是你的意思?这是 EF、Linq to Sql 还是别的什么?
      • 对不起,我第一次创建问题时没有想到。使用英孚。在之前的原始问题中添加了该部分。
      【解决方案5】:
        var t = new List<string> { "a", "b", "c" };
      

      var y = "a b d";

      var res = y.Count(x => t.Contains(x.ToString()));

      【讨论】:

      • 不,我很确定这不是 OP 所要求的。
      【解决方案6】:

      像这样:

      List<string> list = new List<string>();
      list.Add("One");
      list.Add("Two");
      
       var result = query.Where(x => list.Contains(x.tags));
      

      【讨论】:

      • Contains 不接受作为参数的项目序列
      • OP 声明 x.tags 是一个字符串,尽管我仍然不确定这个问题
      • 如果 x.tags 与列表完全匹配,则此方法有效。如果我想有 LIKE 效果怎么办?只要标签是“一个牛奶”,“一个冰箱”,Said 就会返回......目前它只会在标签是“一个”时返回。
      猜你喜欢
      • 2021-12-11
      • 2016-01-27
      • 2021-11-26
      • 2023-03-14
      • 1970-01-01
      • 2016-04-10
      • 2015-03-24
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多