C# 如何控制IEnumerable上的更新

C# 如何控制IEnumerable上的更新,c#,oop,domain-driven-design,ienumerable,C#,Oop,Domain Driven Design,Ienumerable,如果我有一个具有以下签名的方法: public IEnumerable<ScheduleDetailsView> StructureSchedule() { bool isStartWeek = false; int index = -1; var week = Enum.GetValues(typeof(Week)).Cast<Week>(); var weekLength = Enum.GetNa

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

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;
    }

现在,此方法的用户应该只填充此结构中的一些属性
(IsWeekend、IsShortDay、ShiftId)
,而不添加新的ScheduleDetailView或更改这些项的顺序或覆盖整个属性
IEnumerable
并将其返回给调用者

例:


这是可以接受的:

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

这是不允许的:因为它会改变工作日

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

这是不允许的:因为它从返回的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)
,并在其更新版本中返回IEnumerable

  • 定义一个接口以公开ScheduleDetailView的子集
  • 使
    ScheduleDetailView
    internal
    ,以便其他程序集不能向下转换为完整类型
  • 使用
  • 定义一个接口以公开ScheduleDetailView的子集
  • 使
    ScheduleDetailView
    internal
    ,以便其他程序集不能向下转换为完整类型
  • 使用

  • 当你想要这种分离时,你谈论的是两个子系统。至少在逻辑上,他们目前可能处于相同的过程中


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

    当你想要这种分离时,你说的是两个子系统。至少在逻辑上,他们目前可能处于相同的过程中



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

    “覆盖整个IEnumerable”是什么意思<代码>IEnumerable
    不能通过其接口进行更改、重新排序等。您只能将其转换回具体类型,如
    List
    (如果它是List)并对其进行更改,但这将违反接口i的意思是这样的:
    IEnumerable x=new List()
    是否要创建一个即使使用强制转换也无法更改的
    IEnumerable
    ,还是只接收在
    StructureSchedule
    内部创建的
    IEnumerable
    ,而不接收在此方法之外创建的任何内容?@arekzyla
    我只接收在StructureSchedule内部创建的IEnumerable,而不接收在此方法之外创建的任何对象
    您所说的“覆盖整个IEnumerable”是什么意思<代码>IEnumerable不能通过其接口进行更改、重新排序等。您只能将其转换回具体类型,如
    List
    (如果它是List)并对其进行更改,但这将违反接口i的意思是这样的:
    IEnumerable x=new List()
    是否要创建一个即使使用强制转换也无法更改的
    IEnumerable
    ,还是只接收在
    StructureSchedule
    内部创建的
    IEnumerable
    ,而不接收在此方法之外创建的任何内容?@arekzyla
    我只接收在StructureSchedule内部创建的IEnumerable,而不接收在此方法之外创建的任何exactly@AnynameDonotcare所以做一个更小的子集!这有什么问题?对于你的问题没有神奇的解决办法:你需要根据你的要求分离你的表面。@anyname不在乎,所以做一个更小的子集吧!这有什么问题?你的问题没有神奇的解决方案:你需要根据你的要求分离你的表面。你能解释更多吗?我只是公开一个视图,但我想根据我的业务规则验证返回的。例如,对象的数量为=7(一周),因此我不希望用户向列表中添加新对象。它们不是两个子系统,有域类和使用域类的mvc web应用程序,我想对mvc开发人员使用的方法进行更多控制,我称之为2个susbsystems。这里没有魔杖,在每一个门阶上验证你的数据。非常感谢,如果我打扰了你,我很抱歉,我只是想用正确的方式来做。你能解释更多吗?我只是公开一个视图,但我想根据我的业务规则验证返回的数据。例如,对象的数量为=7(一周),因此我不希望用户向列表中添加新对象。它们不是两个子系统,有域类和使用域类的mvc web应用程序,我想对mvc开发人员使用的方法进行更多控制,我称之为2个susbsystems。这里没有魔杖,在每一个门阶上验证你的数据。非常感谢,如果我打扰了你,我很抱歉,我只想用正确的方式来做。
    
    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
    
    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