C#LINQ选择数组/列表

时间:2017-01-05 11:46:55

标签: 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>();

我如何将其修剪为一行,并将其从&#34;黑名单&#34; ? 更像是......

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

8 个答案:

答案 0 :(得分:9)

将其添加到数组中,然后使用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>();

答案 1 :(得分:8)

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<>IQueryable<>将自行投放的内容,您可能最好将其删除。

答案 2 :(得分:6)

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

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

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

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

答案 3 :(得分:4)

对于任何集合的检测交集,您可以使用.Contains()方法。 简单地说:

1)确定你blackList:

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

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>();

答案 4 :(得分:3)

创建包含所有无效值的List<string>

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

并替换

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

where !sBlackList.Contains(s.Code)

答案 5 :(得分:3)

您也可以使用与此类似的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);

答案 6 :(得分:1)

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

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

答案 7 :(得分:-1)

尝试将所有坏码放入Hashset,并查找不在&#34; blacklist-havehest&#34;

中的值

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