我有一个 LINQ 查询,它给了我一个包含多个子列表的列表,所有这些子列表都具有双值。
我想从中得到一个查询结果。
如何获得第一个、最后一个、最高和最低的双精度值?
它应该是一个新对象,新的返回值应该是一个列表吗?
我有一个 LINQ 查询,它给了我一个包含多个子列表的列表,所有这些子列表都具有双值。
我想从中得到一个查询结果。
如何获得第一个、最后一个、最高和最低的双精度值?
它应该是一个新对象,新的返回值应该是一个列表吗?
确实,手动编码的版本会快一点,但除非您知道性能是您的应用程序的关键问题,否则我不会担心这一点。代码的 LINQ 版本如下所示:
IEnumerable<List<double>> queryResults = /*...*/
var aggregates =
from ds in queryResults
select new {
First = ds[0], Last = ds[ds.Count - 1],
Lowest = ds.Min(), Highest = ds.Max() };
我认为这绝对更容易阅读:-)。如果嵌套的东西 ( ds
) 不是类型,List
那么您将需要使用First()
和Last()
扩展方法而不是直接索引。
请注意,如果您对性能感兴趣,您还可以使用并行 LINQ,它在多个线程上运行查询。对于短名单,没有真正的理由这样做,但如果集合很大,它可能会给你更好的性能(比单线程手动编码版本更好)。
你的问题相当不清楚。但是,听起来您有一系列从 LINQ 查询返回的列表对象,并且您希望从所有这些子列表中的值中获取一些聚合。我从来没有在 LINQ 中看到过这样做的方法,老实说,即使有办法做到这一点,我也不认为性能可能会那么好。您正在寻找的聚合非常简单,可以通过循环手动计算。像这样的东西:
double min = 200000000;
double max = -200000000;
double first = 0;
double last = 0;
bool hasFoundFirst = false;
foreach ( List<double> childList in queryResults )
{
foreach ( double val in childList )
{
if ( !hasFoundFirst )
{
hasFoundFirst = true;
first = val;
}
if ( val < min )
min = val;
if ( val > max )
max = val;
last = val;
}
}
这样的事情会以一种非常有效的方式为您提供您正在寻找的结果。这种事情,如果你能有效地编码,往往会比 LINQ 快。LINQ 很棒,我用它做很多事情,但它只是众多工具中的一种。