Linq Where 条件匹配数组
Posted
技术标签:
【中文标题】Linq Where 条件匹配数组【英文标题】:Linq Where condition to match array 【发布时间】:2013-08-17 11:29:36 【问题描述】:我有一个从模型中的数据库获得的 linq 列表。现在我有一个从我的控制器获得的字符串数组。我要构造一个语句
伪代码
List<object> objlist = db.objects.tolist();
string[] strarray; // obtained from a long code.
var k = objlist.Where(u => u.somecol == strarray[0] || u.somecol == strarray[1]........strarray[n]).toList();
我有点困惑如何做到这一点,因为我的strarray[]
是可变长度的,最多可以包含 1000 个单词。
【问题讨论】:
【参考方案1】:您可以使用Array.IndexOf<T> Method:检查数组是否包含某些项目:
bool strarrayContainsX = Array.IndexOf<string>(strarray, "X") >= 0;
但是,我建议您使用 HashSet<string> 而不是字符串数组来存储多个项目。 The HashSet<T> Class 提供 Contains Method 来检查集合是否包含某些项目:
HashSet<string> strset = new HashSet<string>(strarray);
bool strsetContainsX = strset.Contains("X");
生成的查询如下所示:
var k = objlist.Where(u => strset.Contains(u.somecol)).ToList();
【讨论】:
如果你使用通用的IndexOf
方法,你可以省略<string>
类型参数,因为它可以被推断出来。如果你使用 Linq 扩展,还有strarray.Contains("X")
。但当然HashSet
对大型集合表现更好。【参考方案2】:
使用Contains
:
var k = objlist.Where(u => strarray.Contains(u.somecol)).toList();
【讨论】:
【参考方案3】:试试这个:
List<object> objlist = db.objects.tolist();
string[] strarray; // obtained from a long code.
var k = objlist.Where(u => strarray.Contains(u.somecol)).toList();
【讨论】:
【参考方案4】:var k = objlist.Where(u => strarray.Any(x=>x == u.somecol)).ToList();
【讨论】:
Linq 有.Any
扩展方法,但Linq 也有.Contains
扩展方法,这样你就可以摆脱最里面的lambda。
@JeppeStigNielsen 是的,没错,但是我对此很熟悉,提交后,我意识到使用Contains
已经有一些其他答案,所以我保持不变。以上是关于Linq Where 条件匹配数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将重复的 where 子句表达式从 linq 拉到函数中?