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

时间:2016-01-06 16:28:10

标签: c# entity-framework linq list contains

我有逗号分隔的电子邮件列表

var emails="a@gmail.com,b@gmail.com,c@gmail.com,d@gmail.com,e@gmail.com,";
var list=new List<string>();
list.Add("c@gmail.com");
list.Add("d@gmail.com");

如何编写查询以查明字符串(电子邮件)是否有任何匹配的电子邮件地址 集合(列表)。

我正在使用EF和电子邮件字符串是类中的属性,列表是独立集合。

4 个答案:

答案 0 :(得分:3)

此解决方案使用linq。由于您的电子邮件地址以逗号分隔(并以逗号结尾),因此我们可以检查电子邮件字符串是否包含列表中的Any()项。我使用ToLower()使其不区分大小写(通常是哪些电子邮件地址)。

var hasMatch = list.Any(item => ","+emails.ToLower().Contains(","+item.ToLower()+","));

答案 1 :(得分:1)

emails.Split(',').Any(e=>list.Contains(e));

或者:

emails.Split(',').Intersect(list).Any();

如果您使用它来查找数据库记录,那么您可以这样做:

db.MyTable.Where(l=>list.Any(e=>l.emails.StartsWith(e+",")) ||
list.Any(e=>l.emails.EndsWith(","+e)) ||
list.Any(e=>l.emails.Contains(","+e+",")) ||
list.Any(e=>l.emails==e)
)

或者您可以使用以下内容进行简化:

db.MyTable.Where(l=>list.Any(e=>(","+l.emails+",").Contains(","+e+",")))

如果您正在寻找第一条记录,第三个选项可能会表现得更好,因为它可能会使用您在电子邮件上的任何索引来快速找到记录,但如果列表很大,它将生成一些非常大的SQL语句(当前实现不幸的是,SQL LINQ提供程序将其转换为CHARINDEX函数而不是LIKE'email%',但这可能会改变。)

第4个选项将生成更简单的SQL,并且如果想要找到匹配的所有记录而不仅仅是第一个记录,则可能会表现得更好。

答案 2 :(得分:0)

您可以按照以下方式执行此操作

emails.Split(',').Any (y => list.Contains (y));

答案 3 :(得分:0)

var emailsList = emails.Split(',');
list.Any( x => emailsList.Contains(x));

Antoher方法

  HashSet<String> emailSet = New HashSet<String>(temp.Split(","));
  list.Any(s => emailSet.Contains(s, StringComparer.Ordinal));

使用HashSet - Contains工作得更快(如果电子邮件字符串可能很大)并删除重复项 并且在区分大小写的情况下比较stringg而不通过ToLower()

创建新字符串