C#以foreach中的某个值开始

时间:2011-02-22 22:40:44

标签: c#

有没有办法从foreach中的某个值开始?具体而言,我想从早上7:30开始。

DateTime start = DateTime.Today; 
var clock = from offset in Enumerable.Range(0, 48)
                 select start.AddMinutes(30 * offset);
foreach (DateTime time in clock)
{
    string timeValue = time.ToString("hh:mmtt");
}

6 个答案:

答案 0 :(得分:5)

简而言之,没有。只需让你的Enumerable.Range覆盖正确的范围(可能需要仔细检查):

var clock = from offset in Enumerable.Range(15, 48)
                 select start.AddMinutes(30 * offset);

修改

更清洁的解决方案可能是:

DateTime start = // set start
DateTime end = // set end
while (start <= end) {
    // do stuff here
    start = start.AddMinutes(30);
}

答案 1 :(得分:2)

无法直接使用foreach语法在集合中“启动”其他值(换行是一个选项,以下示例甚至可以被视为一种形式包装 - LINQ生成通常是懒惰的,但 可以迭代适当修改的集合并获得所需的语义。

Enumerable.Range会返回IEnumerable<T>的内容 - 您可以随时Where - 限制或Skip - 通过它(例如,see the IEnumerable/LINQ (extension) methods),然后使用结果作为“为每个人”的集合。

例如(这依赖于时间在增加并且有些“效率低下”这一事实,但在大多数应用程序中,它甚至无关紧要的机会接近于零):

foreach (DateTime time in clock.Where(t => t >= someStartTime)) {
    string timeValue = time.ToString("hh:mmtt");
}

基于ide评论的另一种解决方案(在我看来,比上面更清洁 - 它还必须评估条件更少):

foreach (DateTime time in clock.SkipWhile(t => t < someStartTime)) {
    ...
}

请注意,这些IEnumerable结果是懒惰评估的流

然而,一些其他答案提供了很好的替代解决方案以及解决问题的不同方法。如果初始序列无法更改和/或用于需要原始数据的不同用途,我只会使用上述内容。

快乐的编码。

答案 2 :(得分:1)

您可以将今天的开始时间设置为上午7:30,如下所示:

DateTime start = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 7, 30, 0);

答案 3 :(得分:0)

最明确的是你专门设置时间并加上它。通过简单地更改枚举的起始点,您将获得所需的起始时间,但不清楚检查的值是什么。

var start = DateTime.Today.Add(new TimeSpan(7, 30, 0));
var times = Enumerable.Range(0, 48)
                      .Select(offset => start.AddMinutes(30 * offset));
foreach (var time in times)
{
    string timeValue = time.ToString("hh:mmtt");
    // ...
}

答案 4 :(得分:0)

只需更换它,它将从早上7:30开始。

var clock = from offset in Enumerable.Range(15, 48)
祝你好运!

答案 5 :(得分:0)

DateTime start = DateTime.Today.Add(new TimeSpan(7, 30, 0)); 

var clock = from offset in Enumerable.Range(0, 48)
                 select start.AddMinutes(30 * offset);
foreach (DateTime time in clock)
{
    string timeValue = time.ToString("hh:mmtt");
}

所以,从今天7:30开始,关键线是第一个:

DateTime start = DateTime.Today.Add(new TimeSpan(7, 30, 0));