如何使用 Linq 检查字符串 属性 是否包含列表集合中的任何字符串
How to use Linq to check if string property contains any of string in a list collection
我有以逗号分隔的电子邮件列表字符串
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");
我如何编写 ling 查询来查明 string(email) 是否有匹配的电子邮件地址
集合(列表).
我正在使用 EF,电子邮件字符串是 class 中的 属性,列表是独立集合。
您可以按照以下方式进行
emails.Split(',').Any (y => list.Contains (y));
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,如果要查找所有匹配的记录而不是仅查找第一个匹配的记录,则可能会执行得更好。
var emailsList = emails.Split(',');
list.Any( x => emailsList.Contains(x));
她的方法
HashSet<String> emailSet = New HashSet<String>(temp.Split(","));
list.Any(s => emailSet.Contains(s, StringComparer.Ordinal));
使用 HashSet - Contains
工作更快(如果电子邮件字符串可以很大)并删除重复项
并比较 case-sensitive 中的 stringg 而没有通过 ToLower()
创建新字符串
此解决方案使用 linq。因为您的电子邮件地址是用逗号分隔的(并以逗号结尾),所以我们可以检查列表中项目的 Any() 是否包含在电子邮件字符串中。我使用 ToLower() 使其不区分大小写(通常是电子邮件地址)。
var hasMatch = list.Any(item => ","+emails.ToLower().Contains(","+item.ToLower()+","));
我有以逗号分隔的电子邮件列表字符串
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");
我如何编写 ling 查询来查明 string(email) 是否有匹配的电子邮件地址 集合(列表).
我正在使用 EF,电子邮件字符串是 class 中的 属性,列表是独立集合。
您可以按照以下方式进行
emails.Split(',').Any (y => list.Contains (y));
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,如果要查找所有匹配的记录而不是仅查找第一个匹配的记录,则可能会执行得更好。
var emailsList = emails.Split(',');
list.Any( x => emailsList.Contains(x));
她的方法
HashSet<String> emailSet = New HashSet<String>(temp.Split(","));
list.Any(s => emailSet.Contains(s, StringComparer.Ordinal));
使用 HashSet - Contains
工作更快(如果电子邮件字符串可以很大)并删除重复项
并比较 case-sensitive 中的 stringg 而没有通过 ToLower()
此解决方案使用 linq。因为您的电子邮件地址是用逗号分隔的(并以逗号结尾),所以我们可以检查列表中项目的 Any() 是否包含在电子邮件字符串中。我使用 ToLower() 使其不区分大小写(通常是电子邮件地址)。
var hasMatch = list.Any(item => ","+emails.ToLower().Contains(","+item.ToLower()+","));