如何将IEnumerable合并到ReactiveList并删除重复的项目?

时间:2016-07-20 01:31:19

标签: c# linq reactiveui

我有ReactiveList<Monitor> MonitorsIEnumerable<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的数量可能达到数千时,性能会很低。

还有其他优雅方式吗?

2 个答案:

答案 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)

对于该代码段,我可以想到两个选项:

  1. ReactiveList在内部使用ISet(这里可能是'HashSet for the Monitor'列表')然后它会利用哈希码来比较O(nlog( n))或其附近的插入时间。当然,Monitor需要覆盖GetHashCode()和Equals()!你可以使用Properties,getter和setter来解决这个问题。

  2. 如果你不能这样做那么O(nn)插入时间是你得到的最好的(没有建立你自己的自定义插入/跟踪代码)但是只要你的比较代码很简单就可以了,在仅对SN进行字符串比较的情况下,我不会太关注速度,但请注意以下内容。

  3. 在比较性能关键(和非语言相关)方案中的字符串时,请确保不使用默认运算符==,有一些主题可以在其他地方更快地进行字符串比较:P