如何使用Linq检查字符串列表中是否包含列表中的任何字符串

本文关键字:字符串 列表 包含 任何 是否 何使用 Linq 检查 | 更新日期: 2023-09-27 18:04:29

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

有点像。

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

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

如有任何帮助,我们将不胜感激。

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

如何使用Linq检查字符串列表中是否包含列表中的任何字符串

编辑:这个答案假设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(匹配标签的数量(。

我以前做过这样的事情:

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

如下:

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

从你的问题中,我不太确定x.tags是字符串还是列表,如果是列表,Jon Skeet的答案是正确的。如果我理解正确的话,尽管x.tags是一个字符串。如果是这样,那么解决方案是:

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

进行计数

list.Count(x => x.tags.IndexOf(x) > -1)
  var t = new List<string> { "a", "b", "c" };

var y="a b d";

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

我最近遇到了一个类似的问题,下面是我如何解决的:

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);
}

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