通用列表更改C#

时间:2019-06-23 06:15:56

标签: c# .net list counter observablecollection

我一直在尝试找到一种方法来做看起来很简单的事情,但是我却一无所获。我只想在每次更新列表中的属性时增加一个计数器,但是我不想编写ChangeCount ++。在每个导致更改的If语句中,我希望它位于数据类中并且更加自动化。

我尝试在DataClass中编写Set方法,但是效果不佳,因为我需要向其传递三个参数,这使我无法使用+ =,这与编写ChangeCount ++;一样糟糕。我看着得到;组;尽管如果我添加自动增量来获得正确的计数,则当它进入集合时它总会显示为0。我使用INotifyPropertyChanged查看了ObservableCollection,但对于我想做的事情似乎过于复杂,尽管我确实认为这可能是唯一的选择,但是我对它的理解还不够,无法使其正常工作。

任何帮助将不胜感激。

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

更新:我偶然发现this code似乎完全符合我的要求,尽管我仍然有兴趣查看其他建议。

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

好的,它仍然无法正常工作。如果我只是更改项目中的值并放回去,则不算作更改,它必须是完全不同的项目。

1 个答案:

答案 0 :(得分:2)

Mb是这样的:

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