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 方法,你可以省略&lt;string&gt; 类型参数,因为它可以被推断出来。如果你使用 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 条件匹配数组的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询不起作用 - 使用 Where 条件不匹配

SQL查询where子句如果没有匹配记录则省略

如何将重复的 where 子句表达式从 linq 拉到函数中?

Mongoose - 是不是可以修改键的值以匹配 find() 查询的 where 条件?

根据匹配 where 条件中的子字符串来选择值

使用 Linq 和 Regex 比较 2 个字符串数组以进行部分匹配