首页 > 解决方案 > 从集合中选择最小值以包含重复项

问题描述

我有 4 个 dutPdItems 的集合。我想找到具有最低 TotTfpRig 的 DutPdSeqNum 以包含重复项。

我想生成一个 linq 查询来查找最小值的项目编号。此查询应返回一个列表。

如果有重复项(如上所示),则应包括等于最小值的所有重复项编号。查询应该返回一个列表。

查询应该返回一个列表中包含 DutPdSeqNum 2 和 3 的 int 列表。

List<DutPdItem> dutPdItemList = new List<DutPdItem>();

DutPdItem dutPd1 = new DutPdItem()
{
    DutPdSeqNum = 1,
    FltTfpTot = 6.4m,
    RigDpMin = 0.0m,
    RigDhr = 0.0m,
    RigAdg = 0.0m,
    RigThr = 0.0m
};
DutPdItem dutPd2 = new DutPdItem()
{
    DutPdSeqNum = 2,
    FltTfpTot = 4.0m,
    RigDpMin = 0.0m,
    RigDhr = 1.55m,
    RigAdg = 0.0m,
    RigThr = 0.0m
};

DutPdItem dutPd3 = new DutPdItem()
{
    DutPdSeqNum = 3,
    FltTfpTot = 4.0m,
    RigDpMin = 0.0m,
    RigDhr = 1.55m,
    RigAdg = 0.0m,
    RigThr = 0.0m
};
DutPdItem dutPd4 = new DutPdItem()
{
    DutPdSeqNum = 4,
    FltTfpTot = 6.3m,
    RigDpMin = 0.0m,
    RigDhr = 0.0m,
    RigAdg = 0.0m,
    RigThr = 0.0m
};
dutPdItemList.Add(dutPd1);
dutPdItemList.Add(dutPd2);
dutPdItemList.Add(dutPd3);
dutPdItemList.Add(dutPd4);

dutPdItemList.Dump("DutyPeriod Item List");

var THRtoDistribute = 2.715m;

// gets the lowest duty period by total pay

var lowestDutyPeriodsByTotPay = dutPdItemList.GroupBy(x => x.TotTfpRig)
                                .Where(g => g.Count() >= 2)
                                .Select(y => y.Key);

// this query does not work, I cannot figure our why
var lowestDutyPeriod = dutPdItemList.Select(dp => dp.TotTfpRig == 
lowestDutyPeriodsByTotPay);                             


lowestDutyPeriodsByTotPay.Dump("lowest duty period");




}
class DutPdItem
{
    public int DutPdSeqNum { get; set; }
    public decimal FltTfpTot { get; set; }
    public decimal RigDpMin { get; set; }
    public decimal RigDhr { get; set; }
    public decimal RigAdg { get; set; }
    public decimal RigThr { get; set; }
    public decimal TotTfpRig => FltTfpTot + RigDpMin + RigDhr + RigAdg + 
RigThr;

我已经弄清楚如何创建 linq 查询。

他们来了:

var minTfp = dutPdItemList.Min(dp => dp.TotTfpRig).Dump("Min Tfp");

var minDutPd = dutPdItemList.Where(dp => dp.TotTfpRig == minTfp).Select(dp => dp.DutPdSeqNum).ToList().Dump("Min Duty Pds");

var countMin = minDutPd.Count().Dump("count minDutPd");

var secondLowestTfp = dutPdItemList.OrderBy(dp => dp.TotTfpRig).Select(dp => dp.TotTfpRig).Skip(countMin).First().Dump("2nd Lowest Tfp");

var secondLowestDutPd = dutPdItemList.OrderBy(dp => dp.TotTfpRig).Select(dp => dp.DutPdSeqNum).Skip(countMin).First().Dump("2nd Lowest Duty Pd");

标签: c#linqpad

解决方案


    public struct IdAndValue {  // Example data structure
        public int id;
        public double val;
    }

    static IEnumerable<IdAndValue> findAllMinimums(ICollection<IdAndValue> data)
    {
        var byValue = data.ToLookup(d => d.val);
        return byValue[byValue.Min(grp => grp.Key)];
    }

要获取列表,请执行findAllMinimums(...).ToList().


推荐阅读