当 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();
希望对您有所帮助
我有一个 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();
希望对您有所帮助