【问题标题】:How do I handle child lists and get new object lists in C# using LINQ?如何使用 LINQ 在 C# 中处理子列表并获取新对象列表?
【发布时间】:2009-03-04 17:22:26
【问题描述】:

我有一个 LINQ 查询,它为我提供了一个包含多个子列表的列表,所有子列表都具有双值。

我想从中得到一个 queryResult。

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

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

【问题讨论】:

  • 请提供一些示例代码 - 目前很难理解您的情况。
  • stackoverflow.com/questions/611441/… 我应该开始一个新线程..
  • numsy,请务必在此处提供一个清晰的示例,说明您正在尝试做什么,我去了链接,但我认为您在这篇文章中的意思在您想要解决的情况下丢失了在那里。

标签: c# .net linq object custom-lists


【解决方案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,它在多个线程上运行查询。对于短名单,没有真正的理由这样做,但如果集合很大,它可能会给您带来更好的性能(比单线程手动编码版本更好)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 2021-10-10
      • 2022-01-22
      • 2014-01-08
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多