选择具有多个时间段字段的行
本文关键字:字段 时间段 选择 | 更新日期: 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;