如果日期跨越多天,Linq会将一行变为多行

时间:2016-04-21 16:32:00

标签: c# datetime

我有一种情况,我希望将跨越多天的一行数据转换为多个对象。

namespace Linq
{
    class Program
    {
        static void Main(string[] args)
        {
            var item = new List<Item>
            {
                new Item {StartDate = DateTime.Now, EndDate = DateTime.Now.AddDays(2)},
                new Item {StartDate = DateTime.Now, EndDate = DateTime.Now.AddMinutes(120)}
            };
        }
    }
}

public class Item
{
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

对于输出我想这样:

由于第一行跨越了两天,我想要Row1的两行

Row1, 21/04/2016
Row1, 22/04/2016
Row2, 21/04/2016

希望这有道理吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试覆盖Item.ToString()。

e.g。

public override string ToString()
{
    var endDateStr = StartDate.Date != EndDate.Date 
        ? Environment.NewLine + EndDate.ToShortDateString() 
        : string.Empty;
    return string.Format("{0}{1}", StartDate.ToShortDateString(), endDateStr);
}

检查here

答案 1 :(得分:0)

您可以使用Create an array or List of all dates between two dates中列出的Linq查询。

var results = items.SelectMany(i => 
       Enumerable.Range(0, 1 + i.EndDate.Subtract(i.StartDate).Days)
      .Select(offset => new { id = i.id, date = i.StartDate.AddDays(offset).Date})
      .ToArray());

为了完成这项工作,我编辑了Item的定义如下:

public class Item
{
    public int id;
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

您可以在https://dotnetfiddle.net/XIfMmr看到它的实际效果。请注意,结果与您想要的结果略有不同,因为DateTime.Now.AddDays(2)将始终为3天。