C# 通过foreach循环中的日期列表更正段落

C# 通过foreach循环中的日期列表更正段落,c#,C#,我的代码中有一个问题,每次我从日期列表中的同一日期开始,我都会在第一次完成foreach循环时将其设置为停止,但我的方式(第二天,我应该在日期之间的“arr”中使用它)从第一个日期开始。我怎样才能用正确的方式得到它? 这是我的代码: #region Präsenzzeit-Check var arrivalDates = dataAccess.Get_dates(userID, date, DateTime.DaysInMonth(date.Year, date.Mont

我的代码中有一个问题,每次我从日期列表中的同一日期开始,我都会在第一次完成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

看看你的代码,我现在根本不确定第二个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项-如果平均而言它总是返回1项以上,那么队列将越来越长

这将是低效的,但会起作用:

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

看看你的代码,我现在根本不确定第二个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项-如果平均而言它总是返回1项以上,那么队列将越来越长

这将是低效的,但会起作用:

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

“foreach循环”-哪一个?我看到两个foreach循环为什么这行代码是:
arrival=arrivalDate.Select(x=>x.ZPZ_Bis)。其中(x=>x!=null)。LastOrDefault()在内部foreach中?它似乎不随循环而变化;它不使用循环变量,也不计算循环使用的任何东西,因此它会被重复调用,每次都有相同的结果,这是浪费resources@CaiusJard你说得对,我已经做过了如果你想让foreach循环从集合中的不同项开始,您要么修改集合,使第一个项不再存在,要么切换到使用for(int;;)样式的循环,该循环可以从更高的索引开始,或者可能考虑在自定义交互模式中执行yield-return,但这可能需要更广泛的代码更改。您想选择哪种方式?“foreach循环”-哪种?我看到两个foreach循环为什么这行代码是:
arrival=arrivalDate.Select(x=>x.ZPZ_Bis)。其中(x=>x!=null)。LastOrDefault()在内部foreach中?它似乎不随循环而变化;它不使用循环变量,也不计算循环使用的任何东西,因此它会被重复调用,每次都有相同的结果,这是浪费resources@CaiusJard你说得对,我已经做过了如果你想让foreach循环从集合中的不同项开始,您要么修改集合,使第一个项不再存在,要么切换到使用for(int;;)样式的循环,该循环可以从更高的索引开始,或者可能考虑在自定义交互模式中执行yield-return,但这可能需要更广泛的代码更改。你想选择哪条路?