Счетчик общего изменения списка C # - PullRequest
2 голосов
/ 23 июня 2019

Я пытался найти способ сделать что-то, что кажется таким простым, но я ничего не могу с этим поделать. Я просто хочу увеличивать счетчик каждый раз, когда обновляю свойство в списке, но я не хочу писать ChangeCount ++; внутри каждого оператора If, который приводит к изменению, я хочу, чтобы он был в классе данных и был более автоматическим.

Я пытался написать метод Set в DataClass, но это не сработало, так как мне нужно было передать ему три параметра, это мешало мне использовать + =, и это было так же плохо, как написание ChangeCount ++ ;. Я посмотрел на получить; задавать; и хотя счет увеличился правильно, если я добавил автоинкремент, чтобы получить, он всегда получал 0, когда в наборе. Я посмотрел на ObservableCollection с использованием INotifyPropertyChanged, но это кажется слишком сложным для того, что я хочу сделать, хотя я чувствую, что это может быть единственным вариантом, однако я не понимаю этого достаточно, чтобы заставить его работать.

Любая помощь будет высоко ценится.

public class DataClass
{
    public int ChangeCount { get; set; }
    public List<Item> items { get; set; }
    public class Item
    {
        ...
        ...
        ...
    }

}

public class ProgramClass
{
    public static void doStuff()
    {
        var dc = new DataClass();

        dc.items = new List<Item>();    
        //List gets populated with lots of items...

        //loop list items with lots of if statements leading to possible
        //changes which should trigger the counter to increase.
        //e.g. 
        dc.items[i].someProperty += 10;

        //Now I want:
        If (dc.ChangeCount > 0) BackupOriginalFileAndWriteNewFile();
    }
}

Обновление: я только что наткнулся на этот код , который, кажется, делает именно то, что я хочу, хотя мне все еще интересно видеть другие предложения.

((INotifyPropertyChanged)dc.items).PropertyChanged += (sender, e) =>
{
    if (e.PropertyName != "Count")
        dc.ChangeCount++;
};

ОК, это все еще не работает. Если я просто изменю значения элемента и верну его обратно, это не будет считаться изменением, это должен быть совершенно другой элемент, вставленный.

1 Ответ

2 голосов
/ 23 июня 2019

Мб примерно так:

public class DataClass
{
    public int ChangeCount => items.Sum(i => i.ItemChangeCount);
    public List<Item> items { get; set; }

    public class Item
    {
        public int ItemChangeCount { get; private set; } = 0;

        private int _prop1;
        public int Prop1
        {
            get => _prop1;
            set { _prop1 = value; ItemChangeCount++; }
        }
    }
}
...