我有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。
答案 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;