将最后一个值复制到其他单元格,直到看到填充的单元格

时间:2019-07-23 06:23:59

标签: c# linq

我有一个如下列表:

2016-10-05 00:00:00.000
NULL
NULL
NULL
2016-08-12 07:46:00.000
NULL
NULL

我需要转换为

2016-10-05 00:00:00.000
 2016-10-05 00:00:00.000
 2016-10-05 00:00:00.000
 2016-10-05 00:00:00.000
2016-08-12 07:46:00.000
 2016-08-12 07:46:00.000
 2016-08-12 07:46:00.000

基本上,我需要捕获最后一次出现的日期并将其复制到下一行,直到看到填充的行。

这是我现在看到的工作方式

foreach (var date in dates)
{
    var lastValue = null;

    if(date != null)
    {
        lastValue = date;
    }
    if(date == null)
    {
        date = lastValue;
    }
    else
    {
        lastValue = date;
    }
}

7 个答案:

答案 0 :(得分:0)

for(int i = 0; i < yourList.Length; i++)
{
         if(yourList[i] == null && i - 1 > 0)
         {
                yourList[i] = yourList[i-1];
         }
}

答案 1 :(得分:0)

为此,我将使用一个简单的for循环

List<DateTime?> dates = new List<DateTime?>()
{
    new DateTime( 2016,10,05,00,00,00),
    null,
    null,
    null,
    new DateTime( 2016, 08, 12 ,07,46,00),
    null,
    null
};


DateTime? latest = null;

for (int i = 0; i < dates.Count; i++)
{
    if (dates[i] == null)
    {
        dates[i] = latest;
    }
    else
    {
        latest = dates[i];
    }
}

答案 2 :(得分:0)

将DateTime类更改为您正在使用的任何类。

DateTime lastValue = NULL;

    foreach(var value in ValuesList){
        if(value == null) 
            value = lastValue;
        else
            lastValue = value;
    }

答案 3 :(得分:0)

使用Linq,

//Read first not null date
DateTime? firstNotNullValue = dates.FirstOrDefault(x => x != null);

//Create List using ternary opeartion
var result = dates.Select(x => x.HasValue ? firstNotNullValue = x.Value : firstNotNullValue).ToList();

答案 4 :(得分:0)

您的代码的第一个问题是该行:

var lastValue = null;

不会编译。编译器应该如何知道他应该使用哪种类型?您需要定义类型。

第二个问题是您不能在此行的foreach迭代中分配新值:

 date = lastValue;

您将需要使用普通的for循环。

它将引发CS1656编译器错误:

循环的第二个问题是您在每次迭代时都通过重新创建并用null进行初始化来覆盖最后一个值。因此,您基本上可以清除最后一项的记忆。在循环外声明变量

答案 5 :(得分:0)

//input
List<DateTime?> dates = new List<DateTime?> { DateTime.Now, null, DateTime.Parse("2019-10-01"), null };

DateTime? lastPresentDate = dates.FirstOrDefault();
if (lastPresentDate.HasValue) 
{
    dates = dates.Select(d => d.HasValue ? lastPresentDate = d : lastPresentDate).ToList();
}

//output
7/23/2019 7:15:48 AM
7/23/2019 7:15:48 AM
10/1/2019 12:00:00 AM
10/1/2019 12:00:00 AM

这只会在出现第一个日期时更正日期,否则将列表保持不变。

答案 6 :(得分:0)

假设您实际上有一个具有其他一些属性的类(例如Product

DateTime? lastDate = null;
var result = products.Select( 
      p => 
      new { 
          Id = p.Id, 
          CreateDate = (p.CreateDate.HasValue ? (lastDate = p.CreateDate) : lastDate)
          //Other properties..
      }
  );

如果没有,只有日期:

DateTime? lastDate = null;
var result = dates.Select(d => (d.HasValue ? (lastDate = d.Value) : lastDate));

如果愿意,可以添加.ToList()