重写 Linq 语句
本文关键字:语句 Linq 重写 | 更新日期: 2023-09-27 18:17:46
这是我目前拥有的:
from s in domainThreads.Values
where (s.IsAvailable)
select s;
但我仍在学习 Linq,并相信我可以在一条线上完成所有内容。 以下看起来正确吗?
domainThreads.Values.Where(s => s.IsAvailable).Any();
我需要.Any()
吗?
Any()
返回一个布尔值,指示给定集合中是否存在任何实体。
与原始 LINQ 表达式的等效项只是:
domainThreads.Values.Where(s => s.IsAvailable)
两者并不等同。
第一个返回所有Values
s.IsAvailable
。
第二个返回是否存在任何此类值。
正确的转换是:
domainThreads.Values.Where(s => s.IsAvailable)
翻译过来就是:
domainThreads.Values.Where(s => s.IsAvailable).Select(s => s)
无论如何,原始查询都会转换为哪个。
你不需要Any()
- 这将返回一个bool
,指示是否有任何元素满足条件。
相反,只需执行以下操作:
domainThreads.Values.Where(s => s.IsAvailable)
domainThreads.Values.Where(s => s.IsAvailable)
就够了。
Any(( 返回一个bool
值,但您的原始查询返回一个数据集。所以只需使用Where()
var result = domainThreads.Values.Where(s => s.IsAvailable);
当您只需要确保至少单个项目满足条件时,Any()
会有所帮助
试试这个
var obj = domainThreads.Values.Where(s => s.IsAvailable == true).Select(o => o);
如果你调用Any()
它会返回bool
,表示你至少有一个项目。
domainThreads.Values.Where(s => s.IsAvailable);
- 此表达式已足够,它等效于 LINQ 语句。
Any()
返回一个布尔值,如果结果包含一个或多个项目,则该布尔值为 true。
var elements = from s in domainThreads.Values
where (s.IsAvailable)
select s;
//elements now contains a list of objects.
这相当于:
elements = domainThreads.Where(s => s.IsAvailable);
它看起来不一样,但不一样。结果为布尔值,如果集合包含任何元素,则返回 true。
你可以写这样的东西,但它真的值得付出努力吗?
var result = domainThreads.Values.Where(s => s.IsAvailable).Select(s => s);
或更短:
var result = domainThreads.Values.Where(s => s.IsAvailable);
编辑:如果你只想有一行代码,你也可以写:
from s in domainThreads.Values where s.IsAvailable select s;
它的可读性要高得多,并且最终生成相同的代码。