C# 通用列表更改C上的计数器#

C# 通用列表更改C上的计数器#,c#,.net,list,counter,observablecollection,C#,.net,List,Counter,Observablecollection,我一直在想办法做一些看起来很简单的事情,但我却一事无成。我只想在每次更新列表中的一个属性时增加一个计数器,但我不想写ChangeCount++;在每个导致更改的If语句中,我希望它位于数据类中,并且更加自动化 我曾尝试在DataClass中编写一个Set方法,但效果不好,因为我需要向它传递三个参数,它阻止了我使用+=并且与编写ChangeCount++;一样糟糕;。我看着他;设置虽然如果我加上自动增量得到的话,计数会正确地增加,但在集合中它总是为0。我使用INotifyPropertyChang

我一直在想办法做一些看起来很简单的事情,但我却一事无成。我只想在每次更新列表中的一个属性时增加一个计数器,但我不想写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();
    }
}

好吧,它还是不起作用。如果我只是更改项目上的值并将其放回,则不算更改,它必须是一个完全不同的项目

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++; }
        }
    }
}
公共类数据类
{
public int changecont=>items.Sum(i=>i.itemchangecont);
公共列表项{get;set;}
公共类项目
{
public int itemchangecont{get;private set;}=0;
私人内部程序1;
公共int Prop1
{
get=>\u prop1;
设置{u prop1=value;ItemChangeCount++;}
}
}
}

为什么不使用?@ErikPhilips?这无助于计算集合中元素属性的更改。它只对改变元素本身有帮助。@Enigmativity是的,这是我刚刚意识到的,它在我改变整个对象时有效,但在我改变对象的属性时无效。您将如何处理它?@dt192-实现
INotifyPropertyChanged
可能是最惯用的方法。如果您不关心性能或智能感知,可能有一种解决方案使用
dynamic
dynamicbject
/
IDynamicMetaObjectProvider
包装对象并跟踪属性/计数。这可能有点极端,显然有我提到的缺点。我实现了这一点,它确实有效,非常感谢。然而,这意味着添加一个额外的临时变量加上get;设置所有33个属性的代码。有没有办法将这些设置为循环?或者你还有其他想法吗?再次感谢。@dt192不是一个很好的代码解决方案,但是如果这个习惯用法对您来说足够普遍,并且您不想重复自己的话,那么看看Fody。您可以在将属性应用于类/属性并将其重写到更改计数器逻辑中的位置进行设置。他们有一个NotifyPropertyChange“weaver”,您可以利用它。
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++; }
        }
    }
}