如果日期跨度为多天,Linq 会将一行转换为多行

本文关键字:转换 一行 Linq 日期 如果 | 更新日期: 2024-10-29 14:57:03

我遇到一种情况,我想将跨越多天的一行数据转换为多个对象。

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

希望这有意义吗?

如果日期跨度为多天,Linq 会将一行转换为多行

可以使用创建数组或列出两个日期之间的所有日期中概述的 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 天。

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

例如

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

在这里查看