我有ReactiveList<Monitor> Monitors
和IEnumerable<Monitor> newMonitors
。在监视器内部,定义了一个独特的SN:
public class Monitor
{
public string SN {get;set;}//unique
}
ReactiveList<Monitor> Monitors
IEnumerable<Monitor> newMonitors
现在,我想将newMonitors
合并到Monitors
,然后按SN
删除重复的项目。
我正在尝试使用ReactiveList
提供的方法而不是一般的LINQ,因为我想保留ReactiveList
及其DerivedCollection
的通知,这些通知在我的绑定中使用。
我目前的解决方案是检查项目是否已经存在并逐个添加,例如
foreach (var m in newMonitors)
{
if(Monitors.Contains(m))//to override the comparison operators here
continue;
else
Monitors.Add(m);
}
我认为当newMonitors的数量可能达到数千时,性能会很低。
还有其他优雅方式吗?
费
答案 0 :(得分:0)
您可以保留一个哈希集并跟踪并行添加的密钥,只有在添加或删除时才会出现需要确保从两个集合中删除的密钥
输入你的班级成员变量
private readonly HashSet<string> _monitorSet = new HashSet<string>();
然后在你的循环中
foreach (var m in newMonitors)
{
if(_monitorSet.Contains(m.SN))
continue;
else
{
_monitorSet.Add(m.SN);
Monitors.Add(m);
}
}
答案 1 :(得分:0)
对于该代码段,我可以想到两个选项:
让ReactiveList
在内部使用ISet
(这里可能是'HashSet for the Monitor'列表')然后它会利用哈希码来比较O(nlog( n))或其附近的插入时间。当然,Monitor需要覆盖GetHashCode()和Equals()!你可以使用Properties,getter和setter来解决这个问题。
如果你不能这样做那么O(nn)插入时间是你得到的最好的(没有建立你自己的自定义插入/跟踪代码)但是只要你的比较代码很简单就可以了,在仅对SN进行字符串比较的情况下,我不会太关注速度,但请注意以下内容。
在比较性能关键(和非语言相关)方案中的字符串时,请确保不使用默认运算符==,有一些主题可以在其他地方更快地进行字符串比较:P