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

13 c# linq

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>();
Run Code Online (Sandbox Code Playgroud)

我如何将其削减到一行并将其从"黑名单"中读取?所以更像......

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

And*_*tel 14

将它添加到数组然后使用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>();
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 9

var keys = (from s in context.Keys
    where !blackList.Contains(s.Code)
    orderby s.Name
    select s).ToList(); // do you really need the ToList?
Run Code Online (Sandbox Code Playgroud)

数组或列表(可以是)

如果你在内存中执行此操作(linq到对象),那么a HashSet将比数组或列表执行得更好.如果你在数据库中这样做,那么它将没有任何区别.

另外,你真的需要它在列表中吗?如果您要循环查看结果或以其他方式执行某些操作IEnumerable<>IQueryable<>将自行投放,您可能最好将其删除.


Ran*_*ger 7

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

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

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

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


fub*_*ubo 6

List<string>使用所有无效值创建一个

List<string> sBlackList = new List<string>(){"BadCode1", "BadCode2", "BadCode3"};
Run Code Online (Sandbox Code Playgroud)

并替换

where s.Code != ANY OF THE VALUES FROM "BLACKLIST" 
Run Code Online (Sandbox Code Playgroud)

where !sBlackList.Contains(s.Code)
Run Code Online (Sandbox Code Playgroud)


S.D*_*Dav 6

您还可以使用与此类似的except 方法:

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

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


小智 5

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

1)确定你的黑名单:

var blackList = new List<string> {"BadCode1", 
                                  "BadCode2", 
                                  "BadCode3", 
                                  "BadCode4",
                                  "BadCode5"};
Run Code Online (Sandbox Code Playgroud)

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

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