C# C LINQ从数组/列表中不包含值的位置选择

C# C LINQ从数组/列表中不包含值的位置选择,c#,linq,C#,Linq,LINQ新手,不确定我想做什么的语法是否正确 我有一个区块列表,数组或列表可能是我不想放入我正在制作的新密钥列表中的任何一个坏代码 目前 var keys = (from s in context.Keys where s.Code != "BadCode1" where s.Code != "BadCode2" where s.Code != "BadCode3"

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>();
创建包含所有无效值的列表

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


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

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

尝试将所有坏代码放在一个Hashset中,并查找不在黑名单hashest中的值


这里有一个很好的例子:

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

数组或列表可以是

如果在内存linq中执行此操作,则哈希集的性能将优于数组或列表。如果你是在数据库中做的,那么它不会有任何区别

还有,你真的需要把它列在列表中吗?如果要循环查看结果或执行IEnumerable或IQueryable将单独提供服务的操作,最好将其忽略。

您也可以使用类似的方法:

var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};

var blackList = context.Keys.Where(s => badCodes.Contains(s.Code));
var filteredKeys = context.Keys.Except(blackList);

所有其他答案都是正确的,但我个人对此很感兴趣:

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

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

我只是喜欢这种方式,使我的代码可读性和易于理解。但同样,其他每个答案都是正确的。

用于检测您可以使用的任何集合的交集。Contains方法。 它只是:

1.确定您的黑名单:

var blackList = new List<string> {"BadCode1", 
                                  "BadCode2", 
                                  "BadCode3", 
                                  "BadCode4",
                                  "BadCode5"};
2按黑名单交叉口过滤请求!黑名单.Containss.Code:

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

这需要2个对数据库的请求。陌生人的方法怎么样?
var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};

var blackList = context.Keys.Where(s => badCodes.Contains(s.Code));
var filteredKeys = context.Keys.Except(blackList);
var keys = context.Keys.Where(x => !blackList.Contains(x.Code))
    .OrderBy(x => x.Name)
    .ToList();
var blackList = new List<string> {"BadCode1", 
                                  "BadCode2", 
                                  "BadCode3", 
                                  "BadCode4",
                                  "BadCode5"};
var keys = (from s in context.Keys
            where !blackList.Contains(s.Code)
            orderby s.Name
            select s).ToList<Keys>();