2016-04-13 8 views
3

私は同じタイプの2つのリストを持っています。リスト<T>。例外(リスト<T>)が期待どおりに機能しない

リストは、ファイルからロードされ、正しいタイプにキャストされた非直列化jsonオブジェクトです。

もう1つは、同じタイプのオブジェクトで作成されたリストです。

私はList2.Except(List1)が、私はこの場合List1

ではありませんList2のすべてを見ることを期待しない場合は、List2List1が持っているすべてのもの、より何を持っていますので、私はサイズの結果Enumerable<T>を見ることを期待0、しかし、私はちょうど比較が起こらなかったかのようにList2の全体を見ているだけです。

IEnumerable<Review> newReviews = reviews.Except(savedRvReviews, new ReviewComparer()); 

は、私はまた、以下のコードEqualityComparer使用してみました:

public class ReviewComparer : IEqualityComparer<Review> 
{ 
    public bool Equals(Review x, Review y) 
    { 
     return x.ReviewID == y.ReviewID; 
    } 

    public int GetHashCode(Review rv) 
    { 
     return EqualityComparer<Review>.Default.GetHashCode(rv); 
    } 
} 

をして同じ結果を得ました。

public class Review : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    [Browsable(false)] 
    public string ReviewID { get; set; } 
    public string ProductID { get; set; } 
    public DateTime DateSubmitted { get; set; } 
    public string ReviewTitle { get; set; } 

    [Browsable(false)] 
    public string ReviewDescription { get; set; } 
    public int ReviewMark { get; set; } 

    [Browsable(false)] 
    public bool Approved { get; set; } 
} 
+0

あなたがExcept inを行っているコードを投稿していないのはなぜですか? –

+0

私はそれを追加しましたが、特別なことは何もありません。 – 5SK5

+0

例外が期待どおりに機能しておらず、正しく使用している場合、ハッシュコードの取得を実装しておらず、正しく等しい値をオーバーライドする可能性があります。 –

答えて

5

IDが等しい場合に2つのレビューが等しいが、ハッシュコードを変更していない比較者を作成しました。等しい2つのレビューは同じハッシュコードを生成し、同じハッシュコードは生成しません。

これを実現する最も簡単な方法は、等しいハッシュコードを同じハッシュコードで返すことです。たとえば、2つのレビューを同じにする唯一のハッシュコードを使用すると、ID:

public class ReviewComparer : IEqualityComparer<Review> 
{ 
    public bool Equals(Review x, Review y) 
    { 
     return x.ReviewID == y.ReviewID; 
    } 

    public int GetHashCode(Review rv) 
    { 
     return rv.ReviewID.GetHashCode(); 
    } 
} 
0

ソリューションは、私のReviewIEquatable<Review>インタフェースを追加した

List2を反復し、LINQクエリを経由してList1を探し、私は0

foreach (Review s in reviews) 
{ 
    var m = from k in savedRvReviews 
    where k.ReviewID == s.ReviewID 
    select k; 

    if (m.Count() == 0) 
    { 
     // Do something with new reviews 
    } 
} 

コードの期待される結果Reviewタイプの取得しますEqualsメソッドをそのまま実装する:

public bool Equals(Review rv) 
    { 
     return this.ReviewID == rv.ReviewID; 
    } 

私が投稿したコードの残りはうまくいきましたが、これは欠けていたものでした。

+0

これは実際に問題を解決していない、あなたはハッシュコードに関連する何かを変更する。 nvoigtsの答えを見てください。 – usr

関連する問題