C# Linq查询语法与方法链:返回类型

C# Linq查询语法与方法链:返回类型,c#,linq,C#,Linq,阅读和阅读,我理解查询语法和方法扩展在语法上有很大的不同。但现在,我有了一个包含测量数据的数据结构,并希望确定百分位。我写道: var ds = (from device in dataSet.devices where !device.paramValues[i].Equals(double.NaN) select device.paramValues[i]).OrderBy(val => val); double median = percent

阅读和阅读,我理解查询语法和方法扩展在语法上有很大的不同。但现在,我有了一个包含测量数据的数据结构,并希望确定百分位。我写道:

var ds = (from device in dataSet.devices
          where !device.paramValues[i].Equals(double.NaN)
          select device.paramValues[i]).OrderBy(val => val);
double median = percentile(ds as IOrderedEnumerable<double>, 0.5);
var ds=(来自dataSet.devices中的设备
其中!device.paramValues[i].Equals(double.NaN)
选择device.paramValues[i]).OrderBy(val=>val);
双中位数=百分位(ds为可计算的,0.5);
一切都很好。ds的类型为System.Linq.OrderedEnumerable

让我困惑的是用查询语法编写整个过程:

var ds = (from device in dataSet.devices
          where !device.paramValues[i].Equals(double.NaN)
          orderby device.paramValues[i]
          select device.paramValues[i]);
double median = percentile(ds as IOrderedEnumerable<double>, 0.5);
from device in dataSet.devices
where !device.paramValues[i].Equals(double.NaN)
select device.paramValues[i] into x //into syntax
orderby x
select x;
var ds=(来自dataSet.devices中的设备
其中!device.paramValues[i].Equals(double.NaN)
orderby device.paramValues[i]
选择设备参数值[i];
双中位数=百分位(ds为可计算的,0.5);
现在,ds的类型是
System.Linq.Enumerable.where选择EnumerableIterator
,对percentile函数的调用失败

还不确定我在这里错过了什么…-没有具体的理由我会选择第二种语法,但我想理解其中的区别。。。谢谢你的帮助

from device in dataSet.devices
where !device.paramValues[i].Equals(double.NaN)
select device.paramValues[i]
转换为以下方法:

dataSet.devices
       .Where(device => !device.paramValues[i].Equals(double.NaN))
       .Select(device => device.paramValues[i]);
添加您的
OrderBy
通话

dataSet.devices
       .Where(device => !device.paramValues[i].Equals(double.NaN))
       .Select(device => device.paramValues[i])
       .OrderBy(val => val);
另一个问题

from device in dataSet.devices
where !device.paramValues[i].Equals(double.NaN)
orderby device.paramValues[i]
select device.paramValues[i];
转化为

dataSet.devices
       .Where(device => !device.paramValues[i].Equals(double.NaN))
       .OrderBy(device => device.paramValues[i])
       .Select(device => device.paramValues[i]);

正如您所看到的,它不是完全相同的方法链,这是因为您得到了不同的对象。内容相同,但返回的类型不同。

请先查看另一个答案。以下是如何使用查询语法执行相同操作:

var ds = (from device in dataSet.devices
          where !device.paramValues[i].Equals(double.NaN)
          orderby device.paramValues[i]
          select device.paramValues[i]);
double median = percentile(ds as IOrderedEnumerable<double>, 0.5);
from device in dataSet.devices
where !device.paramValues[i].Equals(double.NaN)
select device.paramValues[i] into x //into syntax
orderby x
select x;

它不是完全相同的代码(没有数据集),但它在@Peri-thx下工作;关键是,
百分位数
需要一个IORDerenumerable。对于IEnumerable,我确认它在这里也起作用……为什么
百分位数
需要知道参数是
IORDerenumerable
?总的来说,Linq的结构不需要任何耦合。事实上,我在文档中看到的
IOrderedEnumerable
唯一独特的方法是
CreateOrderedEnumerable
,它的功能可以通过扩展方法
ThenBy
和/或
ThenBy降序
@BrianS通过给出
百分位数
来实现,我们告诉调用方该方法需要一个排序序列,因此由调用方提供一个排序序列;调用方也可以合理地假设该方法不会对其输入进行重新排序。@Peri-编译器优化似乎拯救了您;您没有在函数百分位中使用参数。。。如果我改为
Console.WriteLine(“它工作”+list.ElementAt(0))我在这里遇到一个异常。。。