首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择具有多个周期时间字段的行

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

Stack Overflow用户
提问于 2016-08-08 05:14:37
回答 2查看 74关注 0票数 2

我使用asp.net mvc和c#,我有数据表,有很多列,有一列有“时间”,并且类似于这种格式。

代码语言:javascript
复制
14
16:30
17:05
...

考虑到我有时间筛选器,用户可以从复选框中选择多个时间,我的筛选器复选框是

代码语言:javascript
复制
4 - 8
8 - 11
11 - 14
14 - 17
17 - 21
21 - 24

现在我要从数据表中筛选

代码语言:javascript
复制
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(); 

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

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

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-08 06:09:37

你可以这样做:

代码语言:javascript
复制
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可能失败的情况

对于输入范围的集合,您可以执行以下操作:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2016-08-08 06:24:50

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38821702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档