LinQ WHERE string.Contains还是string.IndexOf?

我需要写一些可以得到相同结果的东西:

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

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

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

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

如果要测试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()

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

如果你想检查o.Name是否包含o.Name中的一些string ,我建议使用LinqKit并使用PredicateBuilder构建查询。

 var predicate = PredicateBuilder.False(); 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);