我的代码有问题,每次我从日期列表中的相同日期开始时,我都会设置过程以在第一次完成时停止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
答案 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