LINQ Aggregate和GroupBy确定正确的数据

时间:2012-03-15 15:27:19

标签: c# .net linq

我有List<ShipmentInformation>

public class ShipmentInformation
{
    public string Type { get; set; }
    public long StartID { get; set; }
    public long EndID { get; set; }
    public DateTime BoxDate { get; set; }
}

我目前有这段代码来确定库存最多的地方:

var TypeTotals = shipmentInfo.GroupBy(x => x.Type).Select(x => new { Type = x.Key, Total = x.Sum(y => (y.EndID - y.StartID) + 1) });

//Select the one with the largest amount of stock
var LargestType = TypeTotals.Aggregate((l, r) => l.Total > r.Total ? l : r).Chip;

但是,如果总计完全相同,则会选择TypeTotals中的最后一项,因此我现在要添加一个签入以确保使用最早的BoxDate

因此,假设我有10件A型和10件B型,目前将选择B型。

我现在想确保当我返回LargestType时它返回具有该类型的最早项目。因此,如果我在A中的任何项目的BoxDate早于B中的任何项目,则应选择A。

2 个答案:

答案 0 :(得分:3)

只需保存每种类型总计的最短日期,然后在您的汇总中将其考虑在内(在我看来,通过简单的foreach循环可以更清晰)

var TypeTotals = shipmentInfo.GroupBy(x => x.Type)
                             .Select(x => new 
                             { 
                               Type = x.Key, 
                               Total = x.Sum(y => (y.EndID - y.StartID) + 1), 
                               Date = x.Min(z=> z.BoxDate) 
                             });

var LargestType = TypeTotals.Aggregate((l, r) =>
{
 if(l.Total > r.Total)
   return l;
 else if(l.Total == r.Total)
   return l.Date < r.Date ?  l : r;
 else return r;
}).Chip;

答案 1 :(得分:2)

您需要将最小日期添加到匿名类。而不是聚合,使用OrderBy和First。

var TypeTotals = shipmentInfo
                     .GroupBy(x => x.Type)
                     .Select(x => new 
                                  {
                                      Type = x.Key,
                                      Total = x.Sum(y => (y.EndID - y.StartID) + 1),
                                      MinBoxDate = x.Min(z => z.BoxDate)
                                  });

//Select the one with the largest amount of stock
var LargestType = TypeTotals
                      .OrderByDescending(l => l.Total)
                      .ThenBy(l => l.MinBoxDate)
                      .First().Chip;