重写 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()吗?

重写 Linq 语句

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; 

它的可读性要高得多,并且最终生成相同的代码。