【问题标题】:Linq Where condition to match arrayLinq Where 条件匹配数组
【发布时间】: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 个单词。

【问题讨论】:

    标签: c# asp.net-mvc linq lambda


    【解决方案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 已经有一些其他答案,所以我保持不变。
        猜你喜欢
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多