2016-07-04 10 views
1

私は2つの配列を持っています。最初のメンバーはすべてのメンバーを保持し、2番目のメンバーはすべてのメンバーを保持します。私は例外を使用してクレームされていないメンバーだけを取得しようとしていますが、結果の配列にはすべてのメンバー(最初の配列の正確なコピー)が含まれています。IEnumerable.Except()除外しない

var junior_handler_All = db2.junior_handler.Include(j => j.person).Include(j => j.status).ToArray(); 

var junior_handler_Claimed = db.junior_handler.Include(j => j.person).Include(j => j.status).ToArray(); 

var junior_handler_Unclaimed = junior_handler_All.Except(junior_handler_Claimed).ToArray(); 

同じ結果を持つwhereクエリを使用して未請求メンバーを取得しようとしました。

var junior_handler_Unclaimed = junior_handler_All.Where(i => !junior_handler_Claimed.Contains(i.Junior_Handler_ID.ToString())); 

これらのいずれかが機能しない理由はありますか?

+7

クラスは独自の 'Equals()'メソッドを実装していますか?参照の平等のテストのみを「例外」および「含む」と思われます。独自の 'IEqualityComparer'や' Equals'実装を提供する必要があります。 –

答えて

2

ExceptContainsの要素を比較する方法は、GetHashCode()と呼び出すことである - をそのハッシュが等しい場合 - 二つの要素が等しいかどうかを確認するEqualsを呼び出します。

だから、簡単な参照の等価チェックにGetHashCode()Equals()、この比較結果の独自の実装を持っていないタイプを参照するために、これを適用した場合。

あなたのオブジェクトの参照を比較したくないかもしれませんが、ある種のIDです。あなたのクラスの

あなたがオーバーライドすることができますいずれかGetHashCode()Equals()

public class Comparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person x, Person y) 
    { 
     return x.ID == y.ID; // or whatever defines your equality 
    } 
    public int GetHashCode(Person obj) 
    { 
     return obj.ID; // or whatever makes a good hash 
    } 
} 

をし、この比較演算子のインスタンスを提供します。

public class Person 
{ 
    public int ID { get; set; } 

    public override bool Equals(object o) 
    { 
     return ID == (o as Person)?.ID; 
    } 
    public override int GetHashCode() 
    { 
     return ID; 
    } 
} 

か、このようなIEqualityComparer<Person>実装するので、次の2つのオプションを持っています〜Except

var junior_handler_Unclaimed = 
    junior_handler_All.Except(junior_handler_Claimed, new Comparer()).ToArray(); 
+0

ありがとうございました。私はあなたの最初の提案を使用し、GetHashCode()とEquals()をオーバーライドします。それは今働いている。 – sdg91

0

IEquatableを実装したり、EqualsとGetHashCodeをオーバーライドしたりするために、クラスを更新する必要があります。

参考文献:除き上

MSDN

は、値を既定の等値比較で

MSDNを比較する既定の等値比較を使用して2つのシーケンスの差集合を生成します:

Defaultプロパティは、T型がSystem.IEquatableインターフェイスを実装しているかどうかをチェックし、TypeIがその実装を使用するEqualityComparerを返します。それ以外の場合、Tによって提供されるObject.EqualsおよびObject.GetHashCodeのオーバーライドを使用するEqualityComparerを返します。

関連する問題