如何控制 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。
- 定义一个接口来公开
ScheduleDetailView
的一个子集
- 制作
ScheduleDetailView
internal
以便其他程序集无法向下转换为完整类型。
- 使用
ImmutableSortedSet<T>
当您想要这种分离时,您正在谈论 2 个子系统。至少在逻辑上,他们现在可能处于同一个过程中。
要获得适当的隔离,请使用 DTO(数据传输对象)。那可能是相同的 class 但它需要不同的实例。消费者应该 return 一个更新的项目列表,然后您 仅 将相关属性复制回原始项目。
如果我有一个具有以下签名的方法:
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。
- 定义一个接口来公开
ScheduleDetailView
的一个子集
- 制作
ScheduleDetailView
internal
以便其他程序集无法向下转换为完整类型。 - 使用
ImmutableSortedSet<T>
当您想要这种分离时,您正在谈论 2 个子系统。至少在逻辑上,他们现在可能处于同一个过程中。
要获得适当的隔离,请使用 DTO(数据传输对象)。那可能是相同的 class 但它需要不同的实例。消费者应该 return 一个更新的项目列表,然后您 仅 将相关属性复制回原始项目。