C# 在LINQ查询中在temp变量中存储类型时的混淆

C# 在LINQ查询中在temp变量中存储类型时的混淆,c#,linq,C#,Linq,我正在编写一个LINQ查询,它有一种子查询。看起来是这样的: var x = from p in pc let Cntrs = p.GetCounters().Where(args => args.CounterName == CounterName) select Cntrs; var x = from p in pc let Cntrs = p.GetCounters()

我正在编写一个LINQ查询,它有一种子查询。看起来是这样的:

        var x = from p in pc
                let Cntrs = p.GetCounters().Where(args => args.CounterName == CounterName)
                select Cntrs;
var x = from p in pc
        let Cntrs = p.GetCounters()
                     .Where(args => args.CounterName == CounterName)
                     .FirstOrDefault()
        select Cntrs;
CNTR是一个PerformanceCounter对象。但是,intellisense会将其作为带有集合方法的集合返回

我没有看到诸如NextValue等属性(这是我想要的)

我错过了什么?还有,我知道之前一定有人问过,let和into关键字之间有什么区别


感谢这意味着
Where
方法返回多个实例,换句话说,您有多个计数器,其名称等于
CounterName
变量的值

如果您不关心您得到的是哪一个,那么可以使用
FirstOrDefault
扩展方法从从
Where
返回的序列中检索第一项,如下所示:

        var x = from p in pc
                let Cntrs = p.GetCounters().Where(args => args.CounterName == CounterName)
                select Cntrs;
var x = from p in pc
        let Cntrs = p.GetCounters()
                     .Where(args => args.CounterName == CounterName)
                     .FirstOrDefault()
        select Cntrs;

不要使用var关键字,谜团就会解开

x是一个
IEnumerable


还有,我知道这一定是 以前问过,有什么区别 在let和into关键字之间

关键字
let
将一个新的查询变量引入范围

from c in Customer
let firstOrder = c.Orders.First()
select new {c, firstOrder}
关键字
into
将一个新的查询变量引入范围,并从范围中删除所有以前的查询变量

from c in Customer
select new {c.Name, c.Orders} into smallerCustomer
select smallerCustomer.Name
c不在最后一个select子句的范围内

from c in Customer
group c by c.Name[0] into g
select g.First()

实际上Where()返回IENumerable。我使用Take()获取1个计数器,但这不起作用。在pc中,var x=from p let Cntrs=p.GetCounters()。其中(args=>args.CounterName==CounterName)。Take(1)选择Cntrs.ElementAt(1);这是可行的,但如果我取1(如上所述),那么当只有一个项目时,我不想使用ElementAt。啊,是的,第一个或默认值是完美的。谢谢