2016-07-20 6 views
0

У меня есть ReactiveList<Monitor> Monitors и IEnumerable<Monitor> newMonitors. Внутри монитора имеется уникальная SN определяется:Как слить IEnumerable в ReactiveList и удалить дублированные элементы?

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 могли быть тысячи.

Любой другой элегантный способ сделать это?

Fei

ответ

0

Вы можете оставить HashSet и следить за ключами, которые были добавлены параллельно, только боль будет, когда вы добавляете или удаляете необходимость убедиться, что вы удаляете из обеих коллекций

Помещенный в переменной-члена класса

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); 
    } 
} 
0

Для этого фрагмента кода есть два варианта я могу думать:

  1. Есть ReactiveList внутренне сделать использование ISet (вероятно, `HashSet для него это Monitor«список»здесь), то он будет использовать хэш-кодов сравните для O (nlog (n)) или туда время вставки. Конечно, монитор должен будет переопределить GetHashCode() и Equals()! Вы, вероятно, можете что-то сделать с помощью свойств, геттеров и сеттеров, чтобы поиграть с ними в соответствии с вашими потребностями.

  2. Если вы не можете этого сделать, тогда время вставки (то есть самое лучшее, что у вас есть) (без создания собственного кода вставки/отслеживания). Но, вероятно, все в порядке, если ваш сравнительный код прост, в случае сравнения строк только с SN, я бы не слишком беспокоился о скорости, но заметьте ниже.

Убедитесь, что вы не используете оператор по умолчанию == при сравнении строк в Performace критической (и неязыковой связанный) сценарии, есть некоторые темы на более быстрых сравнениях Струнных на SO в другом месте: P