选择具有多个时间段字段的行

本文关键字:字段 时间段 选择 | 更新日期: 2023-09-27 18:01:25

我使用asp.net MVC和c#我有一个数据表,有很多列,一列有'时间'和像这样的格式排序的数据

14
16:30
17:05
...

在视图中我有时间过滤器,用户可以从复选框中选择多个时间,我的过滤器复选框是

4 - 8
8 - 11
11 - 14
14 - 17
17 - 21
21 - 24

现在我想从datatable

中筛选
var result = from r in myDataTable.AsEnumerable()  
             where r.Field<string>("time")  // between any passed time,like between 4-8 and 11-14 and 21-24
             select r;  
DataTable dtResult = result.CopyToDataTable(); 

我的问题是,我不知道有多少用户通过了时间,如果只是通过一次很容易,但我不知道有多少时间通过了

我如何编辑代码接受任何时间和任何计数的时间?

谢谢你的帮助

选择具有多个时间段字段的行

你可以这样做:

string input = "4 - 17"; // The input from your check box
var sections = input.Split('-');
int beginHour = int.Parse(sections[0].Trim());
int endHour = int.Parse(sections[1].Trim());
var result = from r in myDataTable.AsEnumerable()
             let time = int.Parse(r.Field<string>("time").Split(':')[0])
             where time >= beginHour && time < endHour
             select r;

确保处理解析到int可能失败的情况


对于一个输入范围的集合,你可以这样做:

List<string> originalData = new List<string> { "4 - 8", "8 - 11", "11 - 14", "14 - 17"};
var ranges = originalData.Select(item =>
{
    var sections = item.Split('-');
    return new
    {
        RangeBegin = int.Parse(sections[0].Trim()),
        RangeEnd = int.Parse(sections[1].Trim())
    };
}).ToList();
var result = from r in myDataTable.AsEnumerable()
             let time = int.Parse(r.Field<string>("time").Split(':')[0])
             from range in ranges
             where time >= range.RangeBegin && time < range.RangeEnd
             select r;

您应该考虑以非字符串格式存储时间。直接比较是困难的。"17"& lt;"9"但是17> 9).记住,程序是算法+数据结构。

var data = new[]
{
    new {Time = "6", Other = "Time6"},
    new {Time = "14", Other = "Time14"},
    new {Time = "16:30", Other = "Time1630"},
    new {Time = "17:05", Other = "Time1705"}
};
string[] inputs = {"4 - 8", "17 - 21"};
var result = from d in data
             let hour = Convert.ToInt32(d.Time.Split(':')[0])
             where inputs.Select(i =>
             {
                 var ranges = i.Split('-');
                 return new
                 {
                     From = Convert.ToInt32(ranges[0].Trim()),
                     To = Convert.ToInt32(ranges[1].Trim())
                 };
             }).Any(range => hour >= range.From && hour < range.To)
             select d;