2011-12-13 76 views
2

这是我目前有:重写一个LINQ声明

from s in domainThreads.Values 
where (s.IsAvailable) 
select s; 

,但我仍然在学习LINQ和相信,我可以得到它全部在一行。以下看起来是否正确?

domainThreads.Values.Where(s => s.IsAvailable).Any(); 

我需要.Any()吗?

+2

你有没有真正尝试过吗?它恢复了你的期望吗?如果不是,请将*作为您的问题发布。 – ChrisF

+0

我没有与我的Visual Studio。我只是在阅读和学习这个术语。 –

回答

3

Any()返回一个布尔值,指示给定集合中是否存在任何实体。

你原来的LINQ表达的等效只会是:

domainThreads.Values.Where(s => s.IsAvailable) 
2

两者是不等价的。

第一次返回全部Values其中s.IsAvailable

第二个返回是否有任何这样的值。

正确的转换:

domainThreads.Values.Where(s => s.IsAvailable) 

翻译为:

domainThreads.Values.Where(s => s.IsAvailable).Select(s => s) 

这是什么原始查询被转换成反正。

1

你不需要Any() - 这将返回一个bool指示是否有任何元素满足条件。

相反,只是做:

domainThreads.Values.Where(s => s.IsAvailable) 
0

它看起来却是不一样的。结果是布尔值,如果集合包含任何元素,则返回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; 

它更可读,并产生相同的代码在最后。

+0

@downvoter:我的回答有什么问题? – slfan

1
domainThreads.Values.Where(s => s.IsAvailable) 

就够了。

1

Any()返回一个bool值,但您的原始查询返回一个数据集。因此,只要使用的时候,你只需要确保至少单个项目满足条件

1

试试这个

var obj = domainThreads.Values.Where(s => s.IsAvailable == true).Select(o => o); 
+0

我发现有人投下了这个答案。这个答案有什么错误吗? –

+0

我提高了你的答案,因为我没有看到任何错误。唯一的是你没有得到一个对象,但结果是一个IEnumerable 。变量名称obj具有误导性。 – slfan

+0

ohh .. var obj会给你匿名类型的对象 –

1

如果你打电话Any()返回bool这表明Where()

var result = domainThreads.Values.Where(s => s.IsAvailable); 

Any()将是有益的你至少有一个项目。

domainThreads.Values.Where(s => s.IsAvailable); 
  • 这种表达是足够的,它相当于LINQ声明。
1

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