LinQ WHERE string.Contains或string.IndexOf?

时间:2013-01-15 21:09:03

标签: c# .net linq

我需要写一些能产生相同结果的东西:

var result = collection.Where( o => o.Name.IndexOf( "some_string2" ) != -1 || o.Name.IndexOf( "some_string_2" ) != -1 || o.Name.IndexOf( "some_string3" ) != -1 )

要检查的字符串的数量和值(some_string_1,2和3)是未知的(来自DB),所以更通用的...

我尝试了以下内容,但失败了......

var stringsToCheck = someCommaSeparatedStrings.ToLower().Split( ',' ).ToList();
var result = collection.Where( o => stringsToCheck.Contains( o.ToLower() ) );

换句话说,我需要检索集合中包含一些特定字符串的所有对象。

4 个答案:

答案 0 :(得分:20)

var result = collection.Where(item => stringsToCheck.Any(stringToCheck => 
    item.Name.Contains(stringToCheck)));

用英语读取这是:给我集合中的所有项目,其中所有字符串中的一个都是集合中字符串的子字符串。

答案 1 :(得分:3)

如果您想测试o.Name是否包含stringToCheck,那么:

var result = collection.Where( o => stringsToCheck.Any(a => o.Name.Contains(a)));

如果您只需要测试相等性,那么:

var result = collection.Where( o => stringsToCheck.Contains(o.Name));

注意:如果您需要应用案例规范化,则应相应地应用ToLower()

答案 2 :(得分:1)

您正在检查集合元素o.ToLower()我假设您必须检查其名称o.Name.ToLower()

答案 3 :(得分:0)

如果您想检查o.Namestring是否包含某些stringsToCheck,我建议您使用LinqKit并使用PredicateBuilder构建查询。

var predicate = PredicateBuilder.False<TypeOfYourObject>();
var stringsToCheck = someCommaSeparatedStrings.ToLower().Split( ',' ).ToList();

foreach(var str in stringsToCheck)
{
     var tmp = str; 
     predicate = predicate.Or(o=> o.Name.IndexOf(tmp) != -1);
} 
resultQuery = collection.Where(predicate);