C# LINQ 从数组/列表中不包含值的位置选择
Posted
技术标签:
【中文标题】C# LINQ 从数组/列表中不包含值的位置选择【英文标题】:C# LINQ select from where value is not contained in array / list 【发布时间】: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>();
【问题讨论】:
【参考方案1】:创建一个包含所有无效值的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)
【讨论】:
【参考方案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://***.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<>
或 IQueryable<>
将自己服务的事情,则最好将其排除在外。
【讨论】:
【参考方案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>();
【讨论】:
以上是关于C# LINQ 从数组/列表中不包含值的位置选择的主要内容,如果未能解决你的问题,请参考以下文章