2016-10-12 11 views
0

まず、新しいアラートを取得してデシリアライズします。ここでは、CommandIDとAlertIDの2つのプロパティだけを比較する必要があります。他のものはすべて無視することができます。結果を比較するのが簡単だったと思われる新しいオブジェクトを作成します。その他のプロパティはすべてnullになります。リスト間の新規アイテムと既存アイテムを取得する

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なければならないalerts

existingAlertsに0が含まれており、同一のCommandIDに及びAlertIDはcurrentAlertsalertsに存在するので、これが1であるべきであるとまったく同じCommandIDに及びAlertIDを含有します。

ここには何が欠けているのかわかりませんが、これを行うにはより良い方法があります。

+4

あなたは 'AlertModel'クラスで正しく' GetHashCode'と 'Equals'を実装しましたか? –

+0

私はあなたに例を挙げたり、それについての投稿を私に指摘することはできません。 – Tsukasa

+0

[MSDN](https://msdn.microsoft.com/en-us/library/ms182358.aspx)は、開始する場所です。 [This](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

AlertModelクラスのEqualsとGetHashCodeをオーバーライドします。 Equalsメソッドを強制的に呼び出す場合は、GetHashCode()で一定の値(たとえば-1)を返します。

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)); 
関連する問題