c# - 从集合中选择最小值以包含重复项
问题描述
我有 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");
解决方案
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()
.
推荐阅读
- php - 如何在 Wordpress 中包含和使用 Laravel 布局?
- c# - 在 Web API 参数中使用破折号
- objective-c - 在运行时,如何列出给定类的所有 Objective-C 类方法?
- javascript - 如何使用 Rxjs switchMap 来抛出错误
- reactjs - 如何键入一个组件,它是动态添加其道具的父组件的子组件?
- django - 如何在 Django 中正确执行查询?
- python - 如何使用 Python 拆分和忽略文件路径字符串中的分隔符
- node.js - 为什么 npm install @angular-devkit/build-angular --force/ 在 Azure 控制台中返回红色函数
- java - 有没有办法将常用的动态例程复制到java方法中?
- java - 如何比较两个包含具有共享属性的对象的arraylist