C#列表按时间顺序按逆时间顺序排序

时间:2016-04-13 08:17:32

标签: c# linq datetime

我将sql server数据库中的Time字段保存为(" HH:mm")格式的nvarchar。

根据每个人的建议。我现在以DateTime格式将时间保存在我的sql server数据库中。虽然我不会需要日期部分,但我会使用这个属性,这样我才能达到我想要的效果。 现在我想做的是根据当前执行时间以反向时间顺序获取行列表。例如,如果我的表格如下:

tblFavoriteTime
ID     Time       Post
1     05:00 AM    Something..
2     09:00 AM    Another..
3     12:00 PM    Hello..
4     01:00 PM    Its 8 am..

当我在中午12:00访问该网站时,我需要按时间倒序排列的时间列表。所以12:00 PM将位于列表的顶部,12:00PM -> 11:00AM -> 10:00AM -> .... 1:00AM -> 12:00AM -> 01:00PM -> 02:00PM -> ..... 11:00PM使用上面的数据,我应该得到:

ID     Time         Post
3     12:00 PM      Hello...
2     09:00 AM      Another..
1     05:00 AM      Something..
4     01:00 PM      Its 1 pm..

有没有办法使用LinQ .OrderBy()或类似的东西来执行此操作:

var mylist = _repository.GetAll().ToList()
            .OrderBy(x => x.TimeStamp.TimeOfDay() .......); 
            //as I explained, Im only getting the time of day though its a datetime object, date part wont matter..

请帮忙!

3 个答案:

答案 0 :(得分:3)

这样做你想要的吗?

var times = new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", };

var output = times.OrderByDescending(x => (x.CompareTo("10:00") <= 0 ? "Z" : "") + x);

我得到以下内容:

10:00 
08:00 
22:40 
13:00 
12:00 
10:30 

DateTime字段中尝试此操作。

var times =
    new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", }
        .Select(x => DateTime.Parse(x));

var output = times.OrderByDescending(x => (x.TimeOfDay.TotalHours <= 10 ? 24.0 : 0.0) + x.TimeOfDay.TotalHours);

我得到与上面相同的结果。

答案 1 :(得分:0)

如果您使用nvarchar卡住”,那么您可以先解析一个TimeSpan,例如

var times = new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", };
var output = times.OrderByDescending(x => TimeSpan.Parse(x));

答案 2 :(得分:0)

TimeSpan now = DateTime.Now.TimeOfDay; //site visit time

var query = rows.ToList()
  .OrderBy(x => x.TimeStamp.TimeOfDay <= now ? 1 : 2)
  .ThenByDescending(x => x.TimeStamp.TimeOfDay);