如何控制 IEnumerable 的更新

How to control the update on IEnumerable

如果我有一个具有以下签名的方法:

public IEnumerable<ScheduleDetailsView> StructureSchedule()
    {
        bool isStartWeek = false;
        int index = -1;
        var week = Enum.GetValues(typeof(Week)).Cast<Week>();
        var weekLength = Enum.GetNames(typeof(Week)).Length;
        List<ScheduleDetailsView> scheduleDetailsViews = new List<ScheduleDetailsView>();
        for (int i = 0; i < weekLength; i++)
        {
            if (isStartWeek)
            {
                if (WorkingGroup.WeekStart == week.ElementAt(i))
                {
                    index = i;
                    i = 0;
                    isStartWeek = false;
                }
            }
            else
            {
                ScheduleDetailsView scheduleDetailsView = new ScheduleDetailsView(i, week.ElementAt((i + index) % weekLength), false, false,0);
                scheduleDetailsViews.Add(scheduleDetailsView);
            }
        }
        return scheduleDetailsViews;
    }

public class ScheduleDetailView
    {
        public ScheduleDetailView(int id, Week workingDay, bool isWeekend, bool isShortDay, int order, int shiftId)
        {
            Id = id;
            WorkingDay = workingDay;
            IsWeekend = isWeekend;
            IsShortDay = isShortDay;
            this.order = order;
            ShiftId = shiftId;
        }

        public int Id { get; set; }
        public Week WorkingDay { get; set; }
        public bool IsWeekend { get; set; }
        public bool IsShortDay { get; set; }
        public int order { get; set; }
        public int ShiftId { get; set; }
        public Shift Shift { get; set; }

    }

现在,此方法的用户应该只填写此结构中的某些属性(IsWeekend ,IsShortDay ,ShiftId ),而无需添加新的 ScheduleDetailView 或更改这些项目的顺序或覆盖整个 IEnumerable 和 return 它返回给调用者。

EX:

id  WorkingDay    IsWeekend  IsShortDay   order  ShiftId 
1     6            false      false         1      -1
2     7            false      false         2      -1
3     1            false      false         3      -1
4     2            false      false         4      -1
5     3            false      false         5      -1
6     4            false      false         6      -1
7     5            false      false         7      -1

接受:

1     6            true       false         1      -1
2     7            false      false         2      -1
3     1            false      false         3      -1
4     2            false      false         4      -1
5     3            false      false         5      -1
6     4            false      false         6      -1
7     5            true       true          7      -1

这是不允许的 : 因为它改变了 WorkingDay

1     5            true       false         1      -1
2     7            false      false         2      -1
3     1            false      false         3      -1
4     2            false      false         4      -1
5     3            false      false         5      -1
6     4            false      false         6      -1
7     6            true       true          7      -1

这是不允许的: 因为它会从 returned IEnum

中删除
1     6            true       false         1      -1
2     7            false      false         2      -1
3     1            false      false         3      -1
4     2            false      false         4      -1
5     3            false      false         5      -1
6     4            false      false         6      -1

如何保证此方法的用户将仅更新先前结构中的 (IsWeekend ,IsShortDay ,ShiftId ) 和更新版本中的 return IEnumerable。

  1. 定义一个接口来公开 ScheduleDetailView
  2. 的一个子集
  3. 制作 ScheduleDetailView internal 以便其他程序集无法向下转换为完整类型。
  4. 使用ImmutableSortedSet<T>

当您想要这种分离时,您正在谈论 2 个子系统。至少在逻辑上,他们现在可能处于同一个过程中。

要获得适当的隔离,请使用 DTO(数据传输对象)。那可能是相同的 class 但它需要不同的实例。消费者应该 return 一个更新的项目列表,然后您 将相关属性复制回原始项目。