Как контролировать обновление в IEnumerable - PullRequest
0 голосов
/ 06 мая 2018

Если у меня есть метод со следующей подписью:

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 и верните его вызывающему.

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

Это недопустимо: , поскольку оно удаляет из возвращенного 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 в его обновленной версии.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Когда вы хотите такое разделение, вы говорите о двух подсистемах. По крайней мере, логично, они могут быть в том же процессе в настоящее время.

Чтобы получить надлежащую изоляцию, используйте DTO (объект передачи данных). Это может быть один и тот же класс, но он требует разных экземпляров. Потребитель должен вернуть обновленный список элементов, а затем скопировать только релевантные свойства обратно в исходные элементы.

0 голосов
/ 06 мая 2018
  1. Определить интерфейс для предоставления подмножества ScheduleDetailView
  2. Сделать ScheduleDetailView internal, чтобы другие сборки не могли быть переведены в полный тип.
  3. Использование ImmutableSortedSet<T>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...