2016-10-12 3 views
0

Сначала мы вытаскиваем новые оповещения и десериализируем их. Теперь мне нужно только 2 свойства, которые нужно сравнить: CommandID и AlertID, все остальные можно игнорировать, поэтому я создаю новый объект, который, как я полагал, было бы легче сравнить результаты. Все остальные свойства становятся нулевыми.Получить новые и существующие элементы между списками

List<AlertModel> alerts = JsonConvert.DeserializeObject<List<AlertModel>>(json) 
.Select(x => new AlertModel() { CommandID = x.CommandID, AlertID = x.AlertID }).ToList(); 

Теперь я хочу, чтобы найти новые оповещения, которые уже не существуют

List<AlertModel> newAlerts = alerts.Except(currentAlerts).ToList(); 

Далее мы тянем, что уже существуют сигналы.

List<AlertModel> existingAlerts = currentAlerts.Intersect(alerts).ToList(); 

Теперь мы храним новые и существующие предупреждения.

currentAlerts.Clear(); 
currentAlerts.AddRange(newAlerts); 
currentAlerts.AddRange(existingAlerts); 

первый запуск alerts содержит 1 пункт newAlerts содержит 1 элемент и existingAlerts содержит 0, как они должны.

2-й прогон не то, что я ожидал.

alerts содержит 1 как следует.

newAlerts содержит 1, и это должно быть 0. currentAlerts содержит тот же самый CommandID и AlertID как в alerts

existingAlerts содержит 0, и это должно быть 1, так как то же самое CommandID и AlertID существует в currentAlerts и alerts.

Не уверен, что мне не хватает здесь, и, возможно, есть лучший способ сделать это.

+4

ли вы что правильно '' GetHashCode' и Equals' в вашем 'AlertModel' классе? –

+0

Я не могу привести пример или указать мне сообщение об этом. – Tsukasa

+0

[MSDN] (https://msdn.microsoft.com/en-us/library/ms182358.aspx) - это место для начала. [Это] (https://msdn.microsoft.com/en-us/library/336aedhh (v = vs.100) .aspx) тоже. Или [это] (http://stackoverflow.com/q/10454519/6400526) –

ответ

1

Заменить этот код:

List<AlertModel> newAlerts = alerts.Except(currentAlerts).ToList(); 

йота это:

List<AlertModel> newAlerts = alerts.Where(x => !currentAlerts.Any(y => y.CommandID == x.CommandID && y.AlertID == x.AlertID)).ToList(); 

Вопрос заключается в том, что ваш alerts список содержит новые элементы (new AlertModel() { CommandID = x.CommandID, AlertID = x.AlertID }). Это справочная проблема.

Animal a = new Animal { Color = "Red" }; 
Animal b = new Animal { Color = "Red" }; 
a == b; // This returns false 

В качестве альтернативы вы можете переопределить метод Equals в вас классе. Для того, чтобы сделать это в своем классе:

public class AlertModel { 
    // Some things 

    public override bool Equals(object model) { 
     return model != null && CommandID == model.CommandId && AlertID == model.AlertID; 
    } 
} 
+0

Отлично работает отлично. – Tsukasa

+0

Вы можете также рассмотреть возможность переопределения GetHashCode(). –

+0

На данный момент я никогда не изучаю метод GetHashCode() '...поэтому я буду искать его :-) – erikscandola

1

Переопределить равные и GetHashCode в классе AlertModel. Возвращайте постоянное значение в GetHashCode() (например, -1), если вы хотите принудительно вызвать метод Equals.

public override bool Equals(object obj) 
{ 
    var that = obj as AlertModel; 

    return that != null && that.AlertId == this.AlertId && that.CommandId == this.CommandId; 
} 

public override int GetHashCode() 
    {   
     int hash = 13; 
     return (this.AlertId.GetHashCode() * this.CommandID.GetHashCode())^hash; 
    } 
0
var uniqueAlerts = alerts.Where(a=> !currentAlerts.Any(c=> c.CommandID == a.CommandID && c.AlertID== a.AlertID));