首页 > 解决方案 > 通用列表更改计数器 C#

问题描述

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

我尝试在 DataClass 中编写一个 Set 方法,但效果不佳,因为我需要向它传递三个参数,它阻止了我使用 += 并且它与编写 ChangeCount++; 一样糟糕。我看着get;放; 尽管如果我添加了自动增量来获取计数,计数会正确上升,但在集合中它总是出现 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();
    }
}

更新:我只是偶然发现了这段代码,它似乎完全符合我的要求,尽管我仍然有兴趣看到其他建议。

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

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

标签: c#.netlistcounterobservablecollection

解决方案


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

推荐阅读