【问题标题】:C# LINQ select from where value is not contained in array / listC# LINQ 从数组/列表中不包含值的位置选择
【发布时间】:2017-05-19 22:51:42
【问题描述】:

LINQ 新手,不确定我想要做什么的正确语法。

我有一个“阻止列表”,一个包含错误代码的数组或列表(可能是其中一个),我不想将它们放入我正在制作的这个新的“密钥”列表中

目前...

var keys = (from s in context.Keys
            where s.Code != "BadCode1"
            where s.Code != "BadCode2"
            where s.Code != "BadCode3"
            where s.Code != "BadCode4"
            where s.Code != "BadCode5"
            orderby s.Name
            select s).ToList<Keys>();

我如何将其缩减为一行并从“阻止列表”中读取? 所以更像...

var keys = (from s in context.Keys
            where s.Code != ANY OF THE VALUES FROM "BLOCKLIST"
            orderby s.Name
            select s).ToList<Keys>();

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    创建一个包含所有无效值的List&lt;string&gt;

    List<string> sBlackList = new List<string>(){"BadCode1", "BadCode2", "BadCode3"};
    

    替换

    where s.Code != ANY OF THE VALUES FROM "BLACKLIST" 
    

    where !sBlackList.Contains(s.Code)
    

    【讨论】:

      【解决方案2】:

      你可以有一个黑名单代码列表,并检查它是否不包含相关代码

      var keys = (from s in context.Keys
                  where !blackList.Contains(s.Code)
                  orderby s.Name
                  select s).ToList<Keys>();
      

      【讨论】:

        【解决方案3】:

        尝试将所有错误代码放入 Hashset 中,并查找不在“blacklist-hashest”中的值

        这里有一个很好的例子:https://stackoverflow.com/a/3944821/1117305

        【讨论】:

          【解决方案4】:

          将其添加到数组中,然后使用Contains:

          var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};
          
          var keys = (from s in context.Keys
                      where !badCodes.Contains(s.Code)
                      orderby s.Name
                      select s).ToList<Keys>();
          

          【讨论】:

            【解决方案5】:
            var keys = (from s in context.Keys
                where !blackList.Contains(s.Code)
                orderby s.Name
                select s).ToList(); // do you really need the ToList?
            

            一个数组或列表(可以是任何一个)

            如果您在内存中执行此操作(linq to objects),那么HashSet 的性能将优于数组或列表。如果您在数据库中执行此操作,则不会有任何区别。

            另外,你真的需要它在列表中吗?如果您要循环遍历结果或以其他方式执行 IEnumerable&lt;&gt;IQueryable&lt;&gt; 将自己服务的事情,则最好将其排除在外。

            【讨论】:

              【解决方案6】:

              你也可以使用类似这样的Except Method

              var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};
              
              var blackList = context.Keys.Where(s => badCodes.Contains(s.Code));
              var filteredKeys = context.Keys.Except(blackList);
              

              【讨论】:

              • 这需要 2 个对数据库的请求。 RandomStranger 的方法怎么样?
              【解决方案7】:

              所有其他答案都是正确的,但我个人是这个的粉丝:

              假设您有一个名为 blackList 的字符串列表,其中包含您要过滤掉的所有字符串。

              var keys = context.Keys.Where(x => !blackList.Contains(x.Code))
                  .OrderBy(x => x.Name)
                  .ToList();
              

              我只是喜欢这样使我的代码可读且易于理解的方式。但同样,其他所有答案都是正确的。

              【讨论】:

                【解决方案8】:

                为了检测任何集合的交集,您可以使用 .Contains() 方法。 很简单:

                1) 确定你的黑名单:

                var blackList = new List<string> {"BadCode1", 
                                                  "BadCode2", 
                                                  "BadCode3", 
                                                  "BadCode4",
                                                  "BadCode5"};
                

                2) 通过与黑名单的交集过滤请求(!blackList.Contains(s.Code)):

                var keys = (from s in context.Keys
                            where !blackList.Contains(s.Code)
                            orderby s.Name
                            select s).ToList<Keys>();
                

                【讨论】:

                  猜你喜欢
                  • 2021-11-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-01-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-04-04
                  相关资源
                  最近更新 更多