c# - 根据集合中现有对象的属性,使用 LINQ 将对象插入集合中

标签 c# .net linq

我有一个对象集合,其中包含如下数据:

FromTime                    Duration

2010-12-28                  24.0000

2010-12-29                  24.0000

2010-12-30                  24.0000

2010-12-31                  22.0000

2011-01-02                  1.9167

2011-01-03                  24.0000

2011-01-04                  24.0000

2011-01-05                  24.0000

2011-01-06                  24.0000

2011-01-07                  22.0000

2011-01-09                  1.9167

2011-01-10                  24.0000

在“FromTime”列中,存在数据“间隙”,即 2011-01-01 和 2011-01-08“缺失”。所以我想做的是循环遍历一系列日期(在本例中为 2010-12-28 到 2011-01-10)并“填充”持续时间为 0 的“缺失”数据。

由于我刚刚开始使用 LINQ,我觉得它应该“相当”容易,但我不太明白。我正在阅读《LINQ in Action》一书,但觉得在解决这个特定问题之前我还有很长的路要走。因此,任何帮助将不胜感激。

大卫

最佳答案

我将像下面这样定义类:

public class DurDate
{
    public DateTime date = DateTime.ToDay;
    public decimal dure = 0;
}

并将编写如下所示的函数:

private IEnumerable<DurDate> GetAllDates(IEnumerable<DurDate> lstDur)
    {

        var min = lstDur.Min(x => x.date).Date;
        var max = lstDur.Max(x => x.date).Date;
        var nonexistenceDates = Enumerable.Range(0, (int) max.Subtract(min).TotalDays)
            .Where(x =>!lstDur.Any(p => p.date.Date == min.Date.AddDays(x)))
            .Select(p => new DurDate {date = min.Date.AddDays(p), dure = 0});

        return lstDur.Concat(nonexistenceDates).OrderBy(x=>x.date);
    }

示例测试用例:

List<DurDate> lstDur = new List<DurDate> { new DurDate { date = DateTime.Today, dure = 10 }, new DurDate { date = DateTime.Today.AddDays(-5), dure = 12 } };

编辑:它的工作原理很简单,首先我要找到最小和最大范围:

var min = lstDur.Min(x => x.date).Date;
var max = lstDur.Max(x => x.date).Date;

哪些天不在给定范围内:

Where(x =>!lstDur.Any(p => p.date.Date == min.Date.AddDays(x)))

找到这几天后,我将选择它们:

Select(p => new DurDate {date = min.Date.AddDays(p), dure = 0})

最后将初始值连接到此列表(并对它们进行排序):

lstDur.Concat(nonexistenceDates).OrderBy(x=>x.date);

关于c# - 根据集合中现有对象的属性,使用 LINQ 将对象插入集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4583016/

相关文章:

c# - 在方法的参数中使用 IEnumerable<T> 类型

c# - 如何跟踪调用的每个方法

javascript - 使用 JINT 从 javascript 文件读取 JSON 对象

c# - 请调试错误消息。 DbArithmeticExpression 参数必须具有数字通用类型

c# - 编写一个函数以在 c# 中按其基本类型的属性过滤项目列表

C# SOAP Web 服务客户端 - 显示如何记录所有原始 SOAP 输入和输出的示例?

c# - 设置 _NO_DEBUG_HEAP

c# - 是否可以使用 ResourceManager 在不使用 .resx 文件的情况下即时创建伪资源?

c# - NHibernate Linq : how to use StartsWith on an integer type

c# - MFC 中的硬件加速