5

我需要写一些与以下结果相同的东西:

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

4 回答 4

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

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

于 2013-01-15T21:13:07.537 回答
5

如果要测试是否o.Name包含a,stringToCheck则:

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

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

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

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

于 2013-01-15T21:37:07.263 回答
1

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

于 2013-01-15T21:14:00.303 回答
0

如果您想检查是否o.Name包含string来自 的某些内容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); 
于 2013-01-15T21:26:21.010 回答