我有一个对象列表。每个对象都有DateTime
属性。
当我添加对象时,通过ParseExact将DateTime实例化到此列表中。
public class Event
{
public Event(string time)
{
Time = DateTime.ParseExact(time, "HH:mm zzz", CultureInfo.InvariantCulture);
}
public DateTime Time { get; set; }
}
这允许我添加如下项目:
Events.AddRange(new List<Event> { new Event("07:00 +" + timeZone), new Event("11:30 +" + timeZone), new Event("16:00 +" +timeZone), new Event("19:00 +" + timeZone), new Event("00:00 +" + timeZone), new Event("03:00 +" +timeZone) });
我使用DateTime,因为它处理后台的时区。
问题是;我想创建一个列表,用当前时间对上面的列表进行排序。
因此,如果列表中有["7:30", "5:12", "15:55", "22:22", "23:59"]
且当前时间是22:19,那么它将从那时起对其进行排序。
所以它会是:["22:22", "23:59", "5:12", "7:30", "15:55"]
我已经有了这样做的功能:
Events.Sort((x,y) => x.Time.TimeOfDay.CompareTo(y.Time.TimeOfDay));
问题在于,它是在同一天(今天)。
用上面的清单说明(鉴于日期和时间是25/7 22:19,它将是:
["22:22 25/7", "23:59 25/7", "5:12 25/7", "7:30 25/7", "15:55 25/7"]
我希望这说明了我的观点,因为日期应该转到26日,过了午夜,依此类推......
另一件事是,它返回一个列表,只要输入长度,但理想情况下这可以永远继续(希望这是有道理的)。能够要求10件物品会很好,并且它将从当前时间返回接下来的10件物品。
修改:澄清 我获取了DateTimes列表,只有DateTime对象的小时和分钟才相关。 从这一刻起,我想获得接下来的10个,25个或50个DateTimes对象。这可以生成,因为小时和分钟是datetime对象中唯一的相关数据。然后应该立即订购这些物品等等。
编辑2:时区 在上面的代码中,timezone =&#34; 0000&#34;,UTC。 这将在用户端自动将时间转换为用户当前位置。
答案 0 :(得分:0)
如果日期早于开始日期,您可以在日期中添加1天:
Events.Sort((x, y) =>
{
var xTime = x.Time;
var yTime = y.Time;
if (xTime < startTime)
xTime = xTime.AddDays(1);
if (yTime < startTime)
yTime = yTime.AddDays(1);
return xTime.CompareTo(yTime);
});
请注意,我比较了日期,而不是TimeOfDay
,因为日期不再是同一天。
这给出了预期的结果:
排序前:
25/07/2015 07:30:00
25/07/2015 05:12:00
25/07/2015 15:55:00
25/07/2015 22:22:00
25/07/2015 23:59:00
排序后:
25/07/2015 22:22:00
25/07/2015 23:59:00
25/07/2015 05:12:00
25/07/2015 07:30:00
25/07/2015 15:55:00
答案 1 :(得分:0)
我最终这样做了。在@JonSkeet之后,我切换到TimeSpan对象而不是DateTime。
public List<Event> Events = new List<Event>();
public void InitializeTimers()
{
Boss tequalt = new Boss("Tequatl the Sunless", BossPriority.HardCore) { Location = "Splintered Coast", Image = "tequatl.jpg" };
Events.AddRange(new List<Event>
{
new Event("07:00", tequalt),
new Event("11:30", tequalt)
});
}
public List<Event> GetEvents(int count)
{
InitializeTimers();
var timeSpanPattern = Events.OrderBy(x => x.Time.Hours).ThenBy(x => x.Time.Hours);
var newOrder = new List<Event>();
var previousTimes = new List<Event>();
foreach (var timespan in timeSpanPattern)
{
if (timespan.Time.CompareTo(DateTime.Now.TimeOfDay) != -1)
newOrder.Add(timespan);
else
previousTimes.Add(timespan);
}
newOrder.AddRange(previousTimes);
var finalList = new List<Event>();
for (int i = 0; i < count; i++)
{
int extraDays = i / (newOrder.Count);
int current = i - (extraDays * newOrder.Count);
if (newOrder[current].Time.CompareTo(DateTime.Now.TimeOfDay) != 1)
extraDays++;
DateTime time = DateTime.ParseExact(newOrder[current].Time.Hours + ":" + newOrder[current].Time.Minutes + " +0000", "H:m zzz", CultureInfo.InvariantCulture).AddDays(extraDays);
var newEvent = new Event { Boss = newOrder[current].Boss, DateAndTime = time, Time = newOrder[current].Time};
newEvent.CalculateCountdown();
finalList.Add(newEvent);
}
finalList.Sort((x,y) => x.DateAndTime.CompareTo(y.DateAndTime));
return finalList;
}
鉴于GetEvents(10)
(日期是2015年7月27日,时间是11:00),它将返回
[0] = Event.DateAndTime = "27-7-2015 11:30";
[1] = Event.DateAndTime = "28-7-2015 7:00";
[2] = Event.DateAndTime = "28-7-2015 11:30";
[3] = Event.DateAndTime = "29-7-2015 7:00";
[4] = Event.DateAndTime = "29-7-2015 11:30";
[5] = Event.DateAndTime = "30-7-2015 7:00";
[6] = Event.DateAndTime = "30-7-2015 11:30";
[7] = Event.DateAndTime = "31-7-2015 7:00";
[8] = Event.DateAndTime = "31-7-2015 11:30";
[9] = Event.DateAndTime = "1-8-2015 7:00";
它根本不是很好,但它完成了工作,并允许我指定我想要的项目数。
如果有人知道如何优化上述内容,我很乐意接受它作为答案。