当 List<sub-class> 数据改变时改变 Class 中的数据

Change data in Class when List<sub-class> data is changed

我有一个 class STimer,里面有一个列表。 serviceDetail 经常在计时器上进行监视,并且很少更改,但是当它确实发生更改时,我想了解这样一个事实,即由于处理能力的原因,数据在没有循环遍历列表的情况下发生了更改。也许这是一个重复的问题,我只是不知道如何搜索它,但我一直在尝试。这是一个代码示例:

class STimers
{

public class ServiceDetail
    {
        private int _serviceKey;
        private bool _isRunning = true;
        private bool _runningStateChanged = false;

        public bool isRunning
        {
            get { return _isRunning; }
            set
            {
                //Check to see if the data is the same, if so, don't change, if not, change and flag as changed
                if(_isRunning = value) { return; }
                else
                {
                    _isRunning = value;
                    _runningStateChanged = true;
        <-- Update STimers._dataChanged to true -->
                }
            }
        }

    }


public List<ServiceDetail> _serviceMonitors = new List<ServiceDetail>();
public bool _dataChanged = false;


}

我可以在列表中执行 .Find 以 return 所有 _serviceMonitors._runningStateChanged=true,但这似乎是每次计时器触发时解析列表的大量工作,可能的话1,000 个循环中只有 1 个会实际发生变化。

这是否可能,或者我是否需要将更改检查移出 class?

您可以通过向您的 ServiceDetail class

添加一个 事件 来获得它
public class ServiceDetail
{
    public event EventHandler<ListChangedEventArgs> ListChanged;
    private int _serviceKey;
    private bool _isRunning = true;
    private bool _runningStateChanged = false;

    private void OnListChanged(ListChangedEventArgs e){
        if (ListChanged != null) ListChanged(this, e);
    }       

    public bool isRunning
    {
        get { return _isRunning; }
        set
        {
            //Check to see if the data is the same, if so, don't change, if not, change and flag as changed
            if(_isRunning = value) { return; }
            else
            {
                _isRunning = value;
                _runningStateChanged = true;
                OnListChanged(new ListChangedEventArgs(this));
    <-- Update STimers._dataChanged to true -->
            }
        }
    }

}

然后像这样定义 ListChangedEventArgs class

public class ListChangedEventArgs:EventArgs
{
    public ServiceDetail serviceDetail { get; set; }
    public ListChangedEventArgs(ServiceDetail s)
    {
        serviceDetail = s;
    }
}

然后为添加到列表中的每个服务详细信息注册到事件

s.ListChanged += (sender, args) => YourFunction();

希望对您有所帮助