LINQ表达式按字符串属性选择对象,其队列属性中的对象的最大数量不重复

时间:2014-07-13 18:59:47

标签: c# linq

我有一个Record对象队列,如下所示:

     public class Record
     {
     public string TypeDesc { get; set; }

     public Queue<Total> Totals { get; set; }

     etc.....
     }

我在编写LINQ表达式时难以提取只有每个TypeDesc中的一个但在每个TypeDesc中的子集,而Totals队列中的Total对象总数最多。

我不确定这是否重要,但只有一个TypeDesc在Totals队列属性中有Total对象。所有其他队列都是空的。大约有8个独特的TypeDesc值。

这是我的尝试,但是&#34; s&#34;上没有总计财产。

var records = Records.Select(c =&gt; c.TypeDesc)。其中(s =&gt; s.Totals.Count).Max()。Distinct();

1 个答案:

答案 0 :(得分:3)

  1. 按照TypeDesc属性
  2. 对记录进行分组
  3. 对于每个组,请选择Totals.Count最高的那个。

  4. records.GroupBy(r => r.TypeDesc)
           .Select(
                g => g.Aggregate((acc, current) => current.Totals.Count > acc.Totals.Count
                                                        ? current
                                                        : acc));
    

    对于像这样的复杂查询,最好稍微打破逻辑,使代码更具可读性:

    Func<IEnumerable<Record>, Record> mostTotals =
        group => group.Aggregate(
            (acc, current) => current.Totals.Count > acc.Totals.Count
                                  ? current
                                  : acc);
    
    var records = records.GroupBy(r => r.TypeDesc)
                         .Select(mostTotals);
    

    通过使用Aggregate来实现第2步,{{3}}遍历该组中的记录,并使用&#34;累加器&#34;跟踪每次迭代时Totals.Count最高的记录。

    为简化起见,聚合函数等同于:

    //for each group
    Record acc = null;
    
    foreach(var current in group)
        acc = current.Totals.Count > acc.Totals.Count
              ? current
              : acc;