如果日期跨度为多天,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 查询。
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);
}
在这里查看