使用LINQ优化时间循环

时间:2015-05-26 11:10:57

标签: c# linq

我有一个包含两列的设置表,“名称”和“值”:

Name       | Value
-----------+-------
start_time | 9:30
end_time   | 4:30
length     |   30

我还有一个结果集,给出了每个时间段的约会数量:

count | time
------+--------
1     | 09:30
2     | 12:00
3     | 14:00
4     | 15:30

我需要显示start_time和end_time之间的所有时间段,其约会数量如下:

(1) 09:30
    10:30
    11:00
    11:30
(2) 12:00
    12:30
    13:00
    13:30
(3) 14:00
    14:30
    15:00
(4) 15:30

这是我得到的:

// data is the result of WebMatrix.Data.Database.Query
public void PrepareHTML(dynamic data) 
{
    StringBuilder SB = new StringBuilder("");
    TimeSpan time = StartTime; // Start/EndTime are `TimeSpan`s defined in another place

    // loop from StartTime to EndTime in 30 min increments
    while(time <= EndTime)
    {
        String t = String.Format(@"{0:hh\:mm}", time);

       try
       {
           var d = GetThisTime(t,data);
           SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d["count"]); // error is here: Cannot apply indexing with [] to an expression of type 'object'
       }
       catch
       {
           SB.AppendFormat("<option value=\"{0}\">{0}</option>", t);
       }

        time = time.Add(Length);
    }
    H = SB.ToString();
}
public IEnumerable<dynamic> GetThisTime(String time, IEnumerable<dynamic> data)
{
    return from a in data
           where time.CompareTo(new TimeSpan(a.time)) == 0
           select a;
}

更新: 我在评论中提出的“错误”并不明显,所以我将在这里复制:

我收到错误
SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d["count"]);

错误是:

  

无法将带有[]的索引应用于“object”类型的表达式

由于似乎不清楚:我不想要IEnumerable的计数,我想要数据集的count列。见上面的第二个表格。

1 个答案:

答案 0 :(得分:1)

现在GetThisTime返回IEnumerable<dynamic>,所以它集合,但你尝试像对象一样使用它。无论如何,您首先需要获取对象,例如使用FirstFirstOrDefault,然后尝试获取属性值。

你可以稍微更改你的GetThisTime proc,所以你不能使用结果,除了在一个地方你可以简单地返回你需要的数量

public dynamic GetThisTime(String time, IEnumerable<dynamic> data)
{
    return (from a in data
           where time.CompareTo(new TimeSpan(a.time)) == 0
           select a["count"]).FirstOrDefault();
}

并像

一样使用它
SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, GetThisTime(t,data));

注意:您的表达式似乎错误:您尝试将字符串与TimeSpan进行比较

更新:我认为你需要改变你的逻辑,比如

public void PrepareHTML(dynamic data) 
{
    StringBuilder SB = new StringBuilder("");
    TimeSpan time = StartTime; // Start/EndTime are `TimeSpan`s defined in another place

    // loop from StartTime to EndTime in 30 min increments
    while(time <= EndTime)
    {
        String t = String.Format(@"{0:hh\:mm}", time);
        var d = GetThisTime(t,data); // Send the String instead of TimeSpan
        if(d != null){
           SB.AppendFormat("<option value=\"{0}\">({1}) {0}</option>", t, d); // error is here: Cannot apply indexing with [] to an expression of type 'object'
       }
       else
       {
           SB.AppendFormat("<option value=\"{0}\">{0}</option>", t);
       }

        time = time.Add(Length);
    }
    H = SB.ToString();
}

public object GetThisTime(String time, IEnumerable<dynamic> data)
{
    return (from a in data
           where time == a.time
           select a["count"]).FirstOrDefault();
}