0

我有一个 LINQ 查询,它给了我一个包含多个子列表的列表,所有这些子列表都具有双值。

我想从中得到一个查询结果。

如何获得第一个、最后一个、最高和最低的双精度值?

它应该是一个新对象,新的返回值应该是一个列表吗?

4

2 回答 2

1

确实,手动编码的版本会快一点,但除非您知道性能是您的应用程序的关键问题,否则我不会担心这一点。代码的 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,它在多个线程上运行查询。对于短名单,没有真正的理由这样做,但如果集合很大,它可能会给你更好的性能(比单线程手动编码版本更好)。

于 2009-03-05T11:16:07.110 回答
0

你的问题相当不清楚。但是,听起来您有一系列从 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 很棒,我用它做很多事情,但它只是众多工具中的一种。

于 2009-03-04T18:24:36.043 回答