正确遍历foreach循环中的日期列表

时间:2019-05-07 08:00:48

标签: c#

我的代码有问题,每次我从日期列表中的相同日期开始时,我都会设置过程以在第一次完成时停止foreach循环,但我会这样做(第二次)我应该在日期之间的“ arr”(第二天)开始的那一天)再次从第一个日期开始。我如何以正确的方式获得它? 这是我的代码:

    #region Präsenzzeit-Check
        var arrivalDates = dataAccess.Get_dates(userID, date, DateTime.DaysInMonth(date.Year, date.Month)); //get dates for user
        var arrival = DateTime.Now;
        A_Zeitplan presences =null;
        int processed = 0;
        foreach (var arr in arrivalDates)
        {
            var arrivalDate = dataAccess.CheckPraesenzzeit(userID, arr);
            arrival = arrivalDate.Select(x => x.ZPZ_Bis).Where(x => x != null).LastOrDefault();
            foreach (var pr in presenceBlock)
            {
                presences = pr;
            }
            if (++processed == 1) break;
        }


        errorMessages.Add(error);
        #endregion

1 个答案:

答案 0 :(得分:2)

看看您的代码,我不确定第二个foreach循环现在到底是什么,而且我也相信第一个foreach循环只运行一次(在这种情况下,它根本不是一个循环,只是一个循环代码块)

我认为您需要执行一些方法调用并逐个处理循环中的项目,而不是破坏它。或者,将它们放在一个可修改的集合中,删除第一个,处理它,然后保留其余的,以便下次运行此代码时,它的第一项是另一个。这种概念/容器称为队列-集合,其中将项目添加到末尾并从头开始(先进先出)进行处理

对于如何修改此代码段以实现这些代码,我没有任何具体建议,因为这是一个很小的代码段,没有周围的上下文,并且如何将其集成到您的更广泛的程序中还不是很明显。每次都会获取日期列表,这将覆盖我建议的“仅以第一为准”的样式。也许您应该在其他地方做一些事情,以使get_dates不再返回相同的第一个日期(将其标记为已处理,并将其排除在考虑范围之外)

这样,从伪代码的角度来看,我认为您需要查看如下代码结构:

var collection = GetData(); //only return unprocessed items
foreach(item in collection)
  ProcessItemAndMarkAsCompleted(item)

在其中循环处理所有项目,然后继续执行程序的地方,或者您需要排队处理它们:

_classLevelQueueCollection.AddAllToEnd(GetData()); //GetData might return between 0 and 10 items
var item = _classLevelQueueCollection.Pop(); //remove one item from queue front
ProcessItemAndMarkAsCompleted(item);

第二种方法是,使队列变短的唯一可能性是,如果GetData()通常返回0个项目-如果平均而言,它总是返回多个项目,则队列将越来越长。

这会效率低下,但是会起作用:

var collection = GetData(); //GetData returns all unprocessed items
var item = collection[0]; //get the first
ProcessItemAndMarkAsCompleted(item); //when marked as completed that item will not be returned by GetData() next time