【问题标题】:select row with multiple period time field选择具有多个时段时间字段的行
【发布时间】:2016-12-13 18:51:28
【问题描述】:

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

14
16:30
17:05
...

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

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

现在我想从数据表中过滤

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(); 

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

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

感谢您的帮助

【问题讨论】:

    标签: c# asp.net asp.net-mvc datatable


    【解决方案1】:

    你可以这样做:

    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;
    

    【讨论】:

    • ,谢谢你的帮助,但是如果我有多个时间,像这个字符串输入 = "4 - 17, 21 - 24 , 8 - 11",在这种情况下我应该怎么做?跨度>
    • 感谢您的帮助
    • @JSon.Mvc - 很高兴听到它对您有所帮助 :)(添加收藏部分时忘记向您发送通知)
    【解决方案2】:

    您应该考虑以非字符串格式存储您的时间。直接比较是困难的(即“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;
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多