从List <T>中选择与不能直接在属性上指定的条件匹配的组

埃里克·T。

我有下面的课程指定数据记录

class DataRecord
{
    public double MeasuredValue { get; set; }
    public DateTime MeasurementDate { get; set; }
}

我想选择一小时(日期无关紧要)范围内的记录,其中记录的数量最大。

例:

  1. 测量日期:2019/01/31 11:50
  2. 测量日期:2019/02/02 17:21
  3. 测量日期:2019/03/01 17:59
  4. 测量日期:2019/03/12 10:54
  5. 测量日期:2019/05/28 11:15

预期输出:1,4,5(因为跨度10:50内- 11:50 3进行了测量)

我想出的代码是

List<DataRecord> records = new List<DataRecord>();
var maxRecordsInAnHour = records.GroupBy(x => x.MeasurementDate.Hour)
                                .Aggregate((g1, g2) => { return g2.Count() > g1.Count() ? g2 : g1; });

当我按属性分组时,此代码返回2和31和5(取决于顺序),Hour并且只对具有相同值的记录Hour进行分组。

如何调整代码以获得预期的输出?

Guilhem上一个

我将针对您的问题提出2种解决方案,具体取决于列表的长度。

初始化:

var myList = new List<DataRecord>
{
    new DataRecord
    {
        MeasurementDate = new DateTime(2019, 1, 31, 11, 50, 0)
    },
    new DataRecord
    {
        MeasurementDate = new DateTime(2019, 1, 31, 17, 21, 0)
    },
    new DataRecord
    {
        MeasurementDate = new DateTime(2019, 1, 31, 17, 59, 0)
    },
    new DataRecord
    {
        MeasurementDate = new DateTime(2019, 1, 31, 10, 54, 0)
    },
    new DataRecord
    {
        MeasurementDate = new DateTime(2019, 1, 31, 11, 54, 0)
    },
};

List<DataRecord> result = new List<DataRecord>();

解决方案1:

var minimumMinutes = myList.Min(x => x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute);
var maximumMinutes = myList.Max(x => x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute);

for (int minutes = minimumMinutes; minutes < maximumMinutes; minutes++)
{
    var list = myList.Where(x =>
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute <= minutes + 60 &&
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute >= minutes);

    if (result.Count < list.Count())
    {
        result = list.ToList();
    }
}

解决方案2:

foreach (var dataRecord in myList)
{
    var minutes = dataRecord.MeasurementDate.Hour * 60 + dataRecord.MeasurementDate.Minute;
    var before = myList.Where(x =>
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute >= minutes - 60 &&
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute <= minutes).ToList();
    var after = myList.Where(x =>
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute <= minutes + 60 &&
        x.MeasurementDate.Hour * 60 + x.MeasurementDate.Minute >= minutes).ToList();

    if (before.Count > result.Count ||
        after.Count > result.Count)
    {
        result = before.Count > after.Count ? before.ToList() : after.ToList();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章